用Python请求和Beautiful Soup分析网页

249 阅读6分钟

按照这个Python教程,可以轻松提取网页的信息。

作者:

Seth Kenlon (红帽团队)

2022年6月16日| 0 评论 |%t min read

注册登录后喜欢

注册登录后喜欢

Python programming language logo with question marks

图片由。

淘宝网

浏览网页可能占了你一天的大部分时间。但这是一个非常手动的过程,不是吗?你必须打开一个浏览器。转到一个网站。点击按钮,移动鼠标。这是一个很大的工作。通过代码与互联网互动不是更好吗?

在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 资源

什么是 IDE?

小抄。Python 3.7 初学者

顶级 Python GUI 框架

下载。7个必不可少的PyPI库

Red Hat 开发人员

最新的Python文章

循环

使用Beautiful Soup的find_all 函数,创建一个for循环,在SOUP 变量中包含的整个网页上循环。除了<p> 标签外,想对其他标签使用你的循环也不是没有道理的,所以把它建成一个自定义的函数,在 Python 中用def 关键字(代表 "定义")来指定。

def loopit():
    for TAG in SOUP.find_all('p'):
        print(TAG)

临时变量TAG 是任意的。你可以使用任何术语,比如ITEMi 或任何你想要的。每次循环运行时,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字符串库进一步解析它。例如,你可以用lensplit 得到一个字数。

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> 标签之后的图片)。

接下来要阅读的内容

Computer screen with files or windows open

使用Beautiful Soup在Python中进行网络刮削的指南

Python中的Beautiful Soup库使从网页中提取HTML变得容易。

阿尤什-夏尔马

(通讯员)

2021年9月15日

HTML code

用Python进行网页抓取的初学者指南

使用基本的Python工具来抓取完整的HTML网站,获得一些实践经验。

Julia Piaskowski

2020年5月22日

标签

刮痧

塞斯-肯隆

Seth Kenlon

Seth Kenlon是一个UNIX极客,自由文化倡导者,独立多媒体艺术家和D&D书呆子。他曾在电影和计算机行业工作过,经常是同时进行。

更多关于我的信息

注册登录后可发表评论。

相关内容

Tips and gears turning

用Thoth自动检查Python中的缺陷

Digital creative of a browser on the internet

如何使用httpx,一个Python的web客户端

Star Trek: inspiring people and their tech since 1964

用Starship在Linux上定制你的Bash提示符

Creative Commons License本作品采用知识共享 署名-相同方式共享 4.0 国际许可协议进行许可。