如何使用请求和美丽的汤与Python使用Web数据3

0
50

介绍

网络为我们提供了比任何人都可以阅读和理解的更多的数据,所以我们经常希望以编程方式处理这些信息,以便使其理解。 有时,这些数据由网站创建者通过.csv或逗号分隔的值文件或通过API(应用程序编程接口)提供给我们。 其他时候,我们需要从网络自己收集文本。

本教程将介绍如何使用请求美丽的 Python软件包,以便利用网页中的数据。 请求模块允许您将Python程序与Web服务集成,而美丽的Soup模块旨在使屏幕快速完成。 使用Python交互式控制台和这两个库,我们将介绍如何收集一个网页并处理那里提供的文本信息。

先决条件

要完成本教程,您将需要一个用于Python 3的开发环境。您可以按照适用于您的操作系统的指南,从“ 如何安装和设置Python 3的本地编程环境”或“ 如何安装Python 3”和“在Ubuntu 16.04服务器上设置编程环境,以配置所需的一切。

此外,您应该熟悉:

考虑到您的开发环境和这些Python编程概念,让我们开始使用请求和美丽的汤。

安装请求

我们先来激活我们的Python 3编程环境。 确保您位于您的环境所在的目录中,并运行以下命令:

. my_env/bin/activate

为了使用网页,我们需要请求页面。 请求库允许您以可读的方式在Python程序中使用HTTP。

在我们的编程环境激活后,我们将使用pip来安装请求:

pip install requests

当请求库正在安装时,您将收到以下输出:

Collecting requests
  Downloading requests-2.18.1-py2.py3-none-any.whl (88kB)
    100% |████████████████████████████████| 92kB 3.1MB/s 
...
Installing collected packages: chardet, urllib3, certifi, idna, requests
Successfully installed certifi-2017.4.17 chardet-3.0.4 idna-2.5 requests-2.18.1 urllib3-1.21.1

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

Requirement already satisfied
...

将请求安装到我们的编程环境中,我们可以继续安装下一个模块。

安装美丽的汤

就像我们在请求一样,我们将安装美味汤与点。 当前版本的Beautiful Soup 4可以使用以下命令安装:

pip install beautifulsoup4

运行此命令后,您应该看到类似于以下内容的输出:

Collecting beautifulsoup4
  Downloading beautifulsoup4-4.6.0-py3-none-any.whl (86kB)
    100% |████████████████████████████████| 92kB 4.4MB/s 
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.6.0

现在既安装了美丽的汤和请求,我们也可以继续了解如何使用图书馆来浏览网站。

通过请求收集网页

使用现在安装的两个Python库,我们可以熟悉一下基本网页。

我们先来谈谈Python交互式控制台

python

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

import requests

我们将把示例网页(以下)的URL( mockturtle.html给变量url

url = 'https://assets.digitalocean.com/articles/eng_python/beautiful-soup/mockturtle.html'

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

page = requests.get(url)

可变page被分配一个响应对象:

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

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

>>> page.status_code
200
>>> 

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

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

page.text

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

'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n    
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n\n<html lang="en-US" 
xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">\n<head>\n  <meta 
http-equiv="content-type" content="text/html; charset=us-ascii" />\n\n  <title>Turtle 
Soup</title>\n</head>\n\n<body>\n  <h1>Turtle Soup</h1>\n\n  <p class="verse" 
id="first">Beautiful Soup, so rich and green,<br />\n  Waiting in a hot tureen!<br />\n  Who for 
such dainties would not stoop?<br />\n  Soup of the evening, beautiful Soup!<br />\n  Soup of 
the evening, beautiful Soup!<br /></p>\n\n  <p class="chorus" id="second">Beau--ootiful 
Soo--oop!<br />\n  Beau--ootiful Soo--oop!<br />\n  Soo--oop of the e--e--evening,<br />\n  
Beautiful, beautiful Soup!<br /></p>\n\n  <p class="verse" id="third">Beautiful Soup! Who cares 
for fish,<br />\n  Game or any other dish?<br />\n  Who would not give all else for two<br />\n  
Pennyworth only of Beautiful Soup?<br />\n  Pennyworth only of beautiful Soup?<br /></p>\n\n  
<p class="chorus" id="fourth">Beau--ootiful Soo--oop!<br />\n  Beau--ootiful Soo--oop!<br />\n  
Soo--oop of the e--e--evening,<br />\n  Beautiful, beauti--FUL SOUP!<br 
/></p>\n</body>\n</html>\n'
>>> 

这里我们看到页面的全文被打印出来,并附带了所有的HTML标签。 然而,因为没有太多的间距而难以阅读。

在下一节中,我们可以利用“美丽的汤”模块以更人性化的方式处理这些文本数据。

用美丽的汤加入页面

美丽的汤库从解析的HTML和XML文档(包括带有非封闭标签的文档或标签汤和其他格式错误的标记)创建一个解析树。 此功能将使网页文本比我们从“请求”模块所看到的更可读。

首先,我们将美丽的汤输入到Python控制台中:

from bs4 import BeautifulSoup

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

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

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

print(soup.prettify())

这将使每个HTML标签自行生成:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta content="text/html; charset=utf-8" http-equiv="content-type"/>
  <title>
   Turtle Soup
  </title>
 </head>
 <body>
  <h1>
   Turtle Soup
  </h1>
  <p class="verse" id="first">
   Beautiful Soup, so rich and green,
   <br/>
   Waiting in a hot tureen!
   <br/>
   Who for such dainties would not stoop?
   <br/>
   Soup of the evening, beautiful Soup!
 ...
</html>

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

查找标签的实例

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

soup.find_all('p')

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

[<p class="verse" id="first">Beautiful Soup, so rich and green,<br/>
  Waiting in a hot tureen!<br/>
  Who for such dainties would not stoop?<br/>
  Soup of the evening, beautiful Soup!<br/>
  Soup of the evening, beautiful Soup!<br/></p>, <p class="chorus" id="second">Beau--ootiful Soo--oop!<br/>
...
  Beau--ootiful Soo--oop!<br/>
  Soo--oop of the e--e--evening,<br/>
  Beautiful, beauti--FUL SOUP!<br/></p>]

您将在上面的输出中注意到数据包含在方括号[ ] 这意味着它是一个Python 列表数据类型

因为它是一个列表,我们可以调用它中的一个特定的项目(例如,第三个<p>元素),并使用get_text()方法从该标签内部提取所有文本:

soup.find_all('p')[2].get_text()

在这种情况下,我们收到的输出将是第三个<p>元素中的内容:

'Beautiful Soup! Who cares for fish,\n  Game or any other dish?\n  Who would not give all else for two\n  Pennyworth only of Beautiful Soup?\n  Pennyworth only of beautiful Soup?'

请注意, \n换行符也显示在上面返回的字符串中。

按类和ID查找标签

引用CSS选择器(如类和ID)的HTML元素可以帮助您在使用美丽的汤时使用Web数据。 我们可以使用find_all()方法来定位特定的类和ID,并将类和ID字符串作为参数传递。

首先,我们来看一下课堂chorus所有实例。 在美丽的汤中,我们将把类的字符串分配给关键字参数class_

soup.find_all(class_='chorus')

当我们运行上述行时,我们将收到以下列表作为输出:

[<p class="chorus" id="second">Beau--ootiful Soo--oop!<br/>
  Beau--ootiful Soo--oop!<br/>
  Soo--oop of the e--e--evening,<br/>
  Beautiful, beautiful Soup!<br/></p>, <p class="chorus" id="fourth">Beau--ootiful Soo--oop!<br/>
  Beau--ootiful Soo--oop!<br/>
  Soo--oop of the e--e--evening,<br/>
  Beautiful, beauti--FUL SOUP!<br/></p>]

将具有chorus类的两个<p>标签段打印到终端。

我们还可以指定我们只想在<p>标签中搜索类chorus ,以防它被用于多个标签:

soup.find_all('p', class_='chorus')

运行上面的行将产生与以前相同的输出。

我们也可以使用美丽的汤来定位与HTML标签相关的ID。 在这种情况下,我们将把字符串'third'分配给关键字参数id

soup.find_all(id='third')

一旦我们运行上面的行,我们将收到以下输出:

[<p class="verse" id="third">Beautiful Soup! Who cares for fish,<br/>
  Game or any other dish?<br/>
  Who would not give all else for two<br/>
  Pennyworth only of Beautiful Soup?<br/>
  Pennyworth only of beautiful Soup?<br/></p>]

与标识为third<p>标签相关联的文本与相关标签一起打印到终端。

结论

本教程让您通过Python中的请求模块检索网页,并对该网页的文本数据进行初步的划分,以了解“美丽汤”。

发表评论