学习本Python教程,轻松从网页中提取相关信息。浏览网页可能会占用您一天的大部分时间。但是,您总是必须手动浏览,这很烦人,不是吗?您必须打开浏览器、访问网站、单击按钮、移动鼠标??……这很耗时。能够通过代码与互联网交互不是很好吗?借助Python的requests模块,可以使用Python从网上获取数据:importrequestsDATA="https://opensource.com/article/22/5/document-source-code-doxygen-linux"PAGE=requests.get(DATA)print(PAGE.text)在上面的代码示例中,您首先导入了请求模块。接下来,您创建两个变量:其中一个称为DATA,用于保存您要下载的URL。在下面的代码中,您将能够在每次运行应用程序时提供不同的URL。不过,就目前而言,最简单的方法是“硬编码”测试URL以用于演示目的。另一个变量是PAGE。代码读取存储在DATA中的URL,然后将其作为参数传递给requests.get函数,最后使用变量PAGE接收函数的返回值。requests模块及其.get函数的功能是:“读取”Internet地址(URL)、访问Internet并下载该地址中的任何内容。当然,涉及的步骤很多。幸运的是,您不必自己弄清楚,这就是Python模块存在的原因。最后,您告诉Python打印requests.get存储在PAGE变量的.text字段中的所有内容。BeautifulSoup如果你运行上面的示例代码,你将获得示例URL的所有内容,它们将不加区别地输出到你的终端。这是因为在代码中,您对请求收集的数据所做的唯一事情就是打印它。然而,解析文本更有趣。Python可以通过其最基本的功能“读取”文本,但解析文本允许您搜索模式、特定单词、HTML标记等。您可以自己解析请求返回的文本,但使用专用模块要容易得多。对于HTML和XML文本,我们有BeautifulSoup库。下面的代码完成了同样的事情,除了它使用BeautifulSoup来解析下载的文本。因为BeautifulSoup可以识别HTML元素,所以您可以使用它的一些内置功能使输出更加美观。比如在程序最后,可以使用BeautifulSoup的.prettify函数对文本进行处理(使其更漂亮),而不是直接打印原文:frombs4importBeautifulSoupimportrequestsPAGE=requests.get("https://opensource.com/article/22/5/document-source-code-doxygen-linux")SOUP=BeautifulSoup(PAGE.text,'html.parser')#按下gutter中的绿色按钮运行脚本。if__name__=='__main__':#doathinghereprint(SOUP.prettify())通过上面的代码,我们保证每一个打开的HTML标签都单独一行输出,适当的缩进有助于说明Tag的继承关系。事实上,BeautifulSoup可以通过更多方式理解HTML标签,而不仅仅是打印出来。您可以选择打印特定标签而不是打印整页。例如,尝试将打印的选择器从print(SOUP.pretify())更改为:print(SOUP.p)这只会打印一个
标签。具体来说,它只打印它遇到的第一个
标签。要打印所有
标签,您需要使用循环。循环使用BeautifulSoup的find_all函数,您可以创建一个for循环,循环遍历包含在SOUP变量中的整个网页。除了
标签之外,您可能还对其他标签感兴趣,因此最好将其构建为自定义函数,由Python中的def关键字(意思是“define”)指定。defloopit():forTAGinSOUP.find_all('p'):print(TAG)你可以随意更改临时变量TAG的名称,比如ITEM或i或任何你喜欢的。每次循环运行时,TAG都会包含find_all函数的搜索结果。在此代码中,它搜索
标签。函数不会自动执行,除非您显式调用它。您可以在代码末尾调用此函数:#按装订线中的绿色按钮运行脚本。if__name__=='__main__':#在这里做一件事loopit()来查看所有的
标签和它们的内容。仅获取内容您可以通过指定仅需要“字符串”(这是“单词”的编程术语)来排除打印标签。defloopit():forTAGinSOUP.find_all('p'):print(TAG.string)当然,一旦你有了网页的文本,你可以进一步用标准的Python字符串库解析它。例如,您可以使用len和split函数来获取单词数:defloopit():forTAGinSOUP.find_all('p'):ifTAG.stringisnotNone:print(len(TAG.string.split()))这将打印每个段落元素中的字符串数,忽略那些没有任何字符串的段落。要获得你需要变量和一些基本数学的字符串总数:defloopit():NUM=0forTAGinSOUP.find_all('p'):ifTAG.stringisnotNone:NUM=NUM??+len(TAG.string.split())print("Grandtotalis",NUM)Python作业您可以使用BeautifulSoup和Python来提取更多信息。以下是有关如何改进您的应用程序的一些想法:接受输入,以便您可以在启动应用程序时指定要下载和分析的URL。计算页面上图像(标签)的数量。计算另一个标签(
标签)内的图像数量(例如,图像仅出现在