按照这个Python教程,可以轻松提取网页的信息。
作者:
Seth Kenlon (红帽团队)
2022年6月16日| 0 评论 |%t min read

图片由。
淘宝网
浏览网页可能占了你一天的大部分时间。但这是一个非常手动的过程,不是吗?你必须打开一个浏览器。转到一个网站。点击按钮,移动鼠标。这是一个很大的工作。通过代码与互联网互动不是更好吗?
在Python模块requests 的帮助下,你可以用Python从互联网上获取数据。
import requests
DATA = "https://opensource.com/article/22/5/document-source-code-doxygen-linux"
PAGE = requests.get(DATA)
print(PAGE.text)
在这个代码示例中,你首先导入模块requests 。然后你创建了两个变量:一个叫DATA ,用来存放你要下载的URL。在这段代码的后期版本中,你将能够在每次运行你的应用程序时提供一个不同的URL。不过现在,最简单的做法是为演示目的 "硬编码 "一个测试URL。
另一个变量是PAGE ,当requests.get 函数读取存储在DATA 中的 URL 时,你将其设置为 的响应。requests 模块和它的.get 函数被预先编程为 "读取 "一个互联网地址(URL),访问互联网,并下载位于该地址的任何内容。
这有很多步骤,你不需要自己去想,这正是 Python 模块存在的原因。最后,你告诉 Python 将requests.get 存储在PAGE 变量的.text 字段中的所有内容print 。
美丽的汤
如果你运行上面的示例代码,你会得到示例 URL 的内容不分青红皂白地倒入你的终端。它之所以这样做,是因为你的代码对requests 所收集的数据所做的唯一事情就是打印它。对文本进行解析更有意思。
Python 可以用它最基本的函数 "阅读 "文本,但是解析文本可以让你搜索模式、特定的单词、HTML 标签等等。你可以自己解析由requests 返回的文本,但是使用一个专门的模块要容易得多。对于HTML和XML,有一个Beautiful Soup库。
这段代码完成了同样的事情,但它使用Beautiful Soup来解析下载的文本。因为Beautiful Soup可以识别HTML实体,你可以使用它的一些内置功能,使输出的内容更容易被人眼解析。
例如,你可以通过Beautiful Soup的.prettify 功能来运行文本,而不是在你的程序结束时打印原始文本。
from bs4 import BeautifulSoup
import requests
PAGE = requests.get("https://opensource.com/article/22/5/document-source-code-doxygen-linux")
SOUP = BeautifulSoup(PAGE.text, 'html.parser')
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
# do a thing here
print(SOUP.prettify())
你的程序的这个版本的输出确保每一个打开的HTML标签都在自己的行上开始,并有缩进以帮助证明哪个标签是另一个标签的父标签。Beautiful Soup意识到HTML标签的方式不仅仅是它的打印方式。
你可以不打印整个页面,而是单列出特定种类的标签。例如,试着把打印选择器从print(SOUP.prettify()改成这样。
print(SOUP.p)
这样就只打印了一个<p> 标签。具体来说,它只打印遇到的第一个<p> 标签。要打印所有的<p> 标签,你需要一个循环。
更多 Python 资源
循环
使用Beautiful Soup的find_all 函数,创建一个for循环,在SOUP 变量中包含的整个网页上循环。除了<p> 标签外,想对其他标签使用你的循环也不是没有道理的,所以把它建成一个自定义的函数,在 Python 中用def 关键字(代表 "定义")来指定。
def loopit():
for TAG in SOUP.find_all('p'):
print(TAG)
临时变量TAG 是任意的。你可以使用任何术语,比如ITEM 或i 或任何你想要的。每次循环运行时,TAG 包含find_all 函数的搜索结果。在这段代码中,<p> 标签正在被搜索。
一个函数除非被明确调用,否则不会运行。你可以在代码的末尾调用你的函数。
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
# do a thing here
loopit()
运行你的代码可以看到所有<p> 标签和每个标签的内容。
只获取内容
你可以通过指定你只想要 "字符串"(编程行话,即 "单词")来排除标签的打印。
def loopit():
for TAG in SOUP.find_all('p'):
print(TAG.string)
当然,一旦你得到一个网页的文本,你可以用标准的Python字符串库进一步解析它。例如,你可以用len 和split 得到一个字数。
def loopit():
for TAG in SOUP.find_all('p'):
if TAG.string is not None:
print(len(TAG.string.split()))
这将打印出每个段落元素中的字符串数量,省略那些没有任何字符串的段落。要想得到一个总字数,可以使用一个变量和一些基本的数学方法。
def loopit():
NUM = 0
for TAG in SOUP.find_all('p'):
if TAG.string is not None:
NUM = NUM + len(TAG.string.split())
print("Grand total is ", NUM)
Python家庭作业
你可以用Beautiful Soup和Python提取更多的信息。这里有一些关于如何改进你的应用程序的想法。
- 接受输入,这样你就可以在启动你的应用程序时指定下载和分析什么URL。
- 计算一个页面上的图片数量(
<img>标签)。 - 计算另一个标签中的图片数量 (
<img>标签 ) (例如,只计算出现在<main>div 中的图片,或者只计算出现在</p>标签之后的图片)。
接下来要阅读的内容
使用Beautiful Soup在Python中进行网络刮削的指南
Python中的Beautiful Soup库使从网页中提取HTML变得容易。
(通讯员)
2021年9月15日
用Python进行网页抓取的初学者指南
使用基本的Python工具来抓取完整的HTML网站,获得一些实践经验。
2020年5月22日
标签
Seth Kenlon是一个UNIX极客,自由文化倡导者,独立多媒体艺术家和D&D书呆子。他曾在电影和计算机行业工作过,经常是同时进行。