Python 可以通过其最基本的功能来“读取”文本,但解析文本允许你搜索模式、特定单词、HTML 标签等。你可以自己解析 requests返回的文本,不过,使用专门的模块会容易得多。针对 HTML 和 XML 文本,我们有Beautiful Soup库。
下面这段代码完成了同样的事情,只不过,它使用了 Beautiful Soup 来解析下载的文本。因为 Beautiful Soup 可以识别 HTML 元素,所以你可以使用它的一些内置功能,让输出对人眼更友好。
例如,在程序的末尾,你可以使用 Beautiful Soup 的 .prettify函数来处理文本(使其更美观),而不是直接打印原始文本:
from bs4 import BeautifulSoupimport requestsPAGE = 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 标签,而不仅仅是将它打印出来。
使用 Beautiful Soup 的 find_all函数,你可以创建一个for循环,从而遍历SOUP变量中包含的整个网页。除了 标签之外,你可能也会对其他标签感兴趣,因此最好将其构建为自定义函数,由 Python 中的def关键字(意思是 “定义”define)指定。
def loopit: for TAG in SOUP.find_all('p'): print(TAG)
你可以随意更改临时变量 TAG的名字,例如ITEM或i或任何你喜欢的。每次循环运行时,TAG中都会包含find_all函数的搜索结果。在此代码中,它搜索的是 标签。
函数不会自动执行,除非你显式地调用它。你可以在代码的末尾调用这个函数:
# Press the green button in the gutter to run the script.if __name__ == '__main__': # do a thing here loopit
运行代码以查看所有的 标签和它们的内容。
只获取内容
你可以通过指定只需要 “字符串string”(它是 “单词words” 的编程术语)来排除打印标签。
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)