前提: 开始前,请确保您的电脑已安装Python3:

> python --version
Python 3.6.5

安装 Requests

为了处理网页,我们需要安装requests, requests库允许您在Python程序中使用HTTP。 接下来, 我们将使用pip安装Requests:

> pip install requests

如果以前安装了请求,您将在终端窗口收到类似以下内容的反馈:

Requirement already satisfied: requests in /usr/local/lib/python3.6/site-packages (2.18.4)

安装 Beautiful Soup

正如我们对请求所做的那样,我们将使用pip安装Beautiful Soup。 可以使用以下命令安装当前版本的Beautiful Soup 4:

> pip install beautifulsoup4

现在安装了Beautiful Soup和Requests,我们可以继续了解如何使用库来抓取网站。通过Requests来收集页面信息, 使用我们现在将要使用的两个Python库,我们可以熟悉逐步完成基本网页。

让我们首先进入Python交互式控制台:

encore#> python
Python 3.6.5 (default, Jun 17 2018, 12:13:06)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

从这里开始,我们将导入Requests模块,以便我们可以收集示例网页:

>>> import requests
>>>

我们将示例网页的URL(下面),blog.icmoc.com分配给变量url:

>>> url = 'https://blog.icmoc.com'
>>>

接下来,我们可以使用request.get() 方法将该页面的请求结果分配给变量页面。 我们将页面的URL(已分配给url变量)传递给该方法。

>>> page = requests.get(url)
>>>

为变量页面分配了一个Response对象:

>>> page
<Response [200]>
>>>

上面的Response对象告诉我们方括号中的status_code属性(在本例中为200)。 可以显式调用此属性:

>>> page.status_code
200
>>>

返回的代码200告诉我们页面下载成功。 以数字2开头的代码通常表示成功,而以4或5开头的代码表示发生了错误。 您可以从W3C的状态码定义中了解有关HTTP状态代码的更多信息。

为了处理Web数据,我们将要访问基于文本的Web文件内容。 我们可以使用page.text读取服务器响应的内容(如果我们想以字节为单位访问响应,则可以读取page.content).

>>> page.text

一旦我们按下ENTER,我们将收到以下输出:

'<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\'utf-8\'>\n<meta content=\'width=device-width, initial-scale=1.0\' name=\'viewport\'>\n<meta content=\'IE=edge\' http-equiv=\'X-UA-Compatible\'>\n<title>邵壮的个人博客 - Encore Shao - Ruby On Rails</title>\n<meta content=\'邵壮\' name=\'author\'>\n<meta content=\'博客, Encore Shao, 邵壮, Ruby On Rails, 上海, 中国, ICMOC, icmoc.com, 个人博客\' name=\'keywords\'>\n<meta content=\'邵壮的个人博客 - 我是一名Web开发人员, 使用Ruby on Rails来构建Web应用程序.\' name=\'description\'>\n<link rel="stylesheet" media="all" href="/assets/application-0d5fa317612a85df0efd616bdfe9bd39b64dfc99113668f5af161e6c4ae0afc5.css" data-turbolinks-track="reload" />\n<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->...</body>\n</html>\n'

接下来,我们可以利用Beautiful Soup模块以更加人性化的方式处理这些文本数据。Beautiful Soup库根据解析的HTML和XML文档(包括带有非封闭标签或标签汤和其他格式错误的标记的文档)创建一个解析树。 此功能将使网页文本比我们从“请求”模块看到的更具可读性。

首先,我们将Beautiful Soup导入Python控制台:

>>> from bs4 import BeautifulSoup
>>> 

接下来,我们将通过模块运行page.text文档,为我们提供一个BeautifulSoup对象 - 也就是说,这个解析页面中的解析树,我们将通过HTML运行Python的内置html.parser。 构造的对象将mockturtle.html文档表示为嵌套数据结构。 这被分配给变量汤。

>>> soup = BeautifulSoup(page.text, 'html.parser')
>>>

要在终端上显示页面的内容,我们可以使用prettify() 方法打印它,以便将Beautiful Soup解析树转换为格式良好的Unicode字符串。

>>> print(soup.prettify())
>>>

这将呈现每个HTML标记在其自己的行上:

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
  <meta content="IE=edge" http-equiv="X-UA-Compatible"/>
  <title>
   邵壮的个人博客 - Encore Shao - Ruby On Rails
  </title>
  <meta content="邵壮" name="author"/>
  <meta content="博客, Encore Shao, 邵壮, Ruby On Rails, 上海, 中国, ICMOC, icmoc.com, 个人博客" name="keywords"/>
  <meta content="邵壮的个人博客 - 我是一名Web开发人员, 使用Ruby on Rails来构建Web应用程序." name="description"/>
  <link data-turbolinks-track="reload" href="/assets/application-0d5fa317612a85df0efd616bdfe9bd39b64dfc99113668f5af161e6c4ae0afc5.css" media="all" rel="stylesheet"/>
  <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
  <!--[if lt IE 9]>
<script src='http://html5shim.googlecode.com/svn/trunk/html5.js'></script>
<![endif]-->
  <meta content="authenticity_token" name="csrf-param">
   <meta content="AouzpgvQhtat9lFM7ilwKb+WzRnW/Hn/8MKPlo5KjGJJ3XrT61MUi1WQHYVsdf2yEZV1fCw/qoY3hH9UqqrIEA==" name="csrf-token">
    <!-- / Global site tag (gtag.js) - Google Analytics -->
    <script src="https://www.googletagmanager.com/gtag/js?id=UA-119023934-1">
    </script>
    <script>
     window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-119023934-1');
    </script>
   </meta>
  </meta>
 </head>
 <body class="home blog wpb-js-composer js-comp-ver-5.0.1 vc_responsive ">
  <div class="fullpage-animated-box">
   <div class="top-box animation">
    <div class="container-fluid fullpage-content">
     <div class="row">
     </div>
     <div class="row">
      <div class="col-sm-12">
       <div class="caption">
        <h1>
         Web 开发者
        </h1>
        <br/>
        <span>
         Hello,我是邵壮
         <em>
          (Encore Shao)
         </em>
         , 一个
         <em>
          Ruby
         </em>
         开发者.
         <br>
          我们使用
          <em>
           Ruby on Rails
          </em>
          来构建Web应用程序!
         </br>
        </span>
       </div>
      </div>
     </div>
    </div>
    <div class="boxing">
    </div>
   </div>
....
</p>]

在上面的输出中,我们可以看到每行有一个标记,并且由于Beautiful Soup使用的树模式,标记是嵌套的。

通过soup对象查找页面tags实例

1. 查找页面title

>>> soup.title
<title>邵壮的个人博客 - Encore Shao - Ruby On Rails</title>

2. 我们可以使用Beautiful Soup的find_all方法从页面中提取单个标记。 这将返回文档中给定标记的所有实例。

>>> soup.find_all('p')

在我们的对象上运行该方法将返回全文以及相关的<p>标签以及该请求标签中包含的任何标签,其中包括换行标签<br/>:

3. 引用CSS选择器(如类和ID)的HTML元素可以帮助您在使用Beautiful Soup处理Web数据时查看。 我们可以使用find_all()方法并将类和ID字符串作为参数传递来定位特定的类和ID。

3.1 首先,让我们找到class_的所有实例。 在Beautiful Soup中,我们将类的字符串分配给关键字参数class_:

>>> soup.find_all(class_='basic-post')

3.2 我们还可以指定我们只想在<p>标签内搜索class_ = 'article',以防它用于多个标签:

>>> soup.find_all('p', class_='article')

3.3 我们还可以使用Beautiful Soup来定位与HTML标记关联的ID。 在这种情况下,我们将字符串'tags'分配给关键字参数id:

>>> soup.find_all(id='tags')

以上就是全部关于BeautifulSoup的入门教程.