上一篇谈到,HTML下载器l使用requests模块下载网页,并返回其内容,那么,其返回的内容究竟是什么呢?我们以贾总裁的百度百科词条为例来进行说明:
在终端中进入python环境并使用requests下载网页内容:
import requests import codecs #codecs可以很方便地对文本文件进行编码和解码 user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36' headers = {'User-Agent':user_agent} #由于我的终端不支持汉语,下面链接中的汉字在复制的过程中已经被转码,不要紧 url = "https://baike.baidu.com/item/%E8%B4%BE%E8%B7%83%E4%BA%AD" r = requests.get(url, headers = headers) r.encoding = '
tf-8' #使用utf-8对内容编码 f = codecs.open('/home/***/test.txt', 'w', encoding='utf-8') f.write(r.text) f.close()
使用文本编辑器(在这里是Atom)打开上述test.txt文件:
可以看到,r.text中的内容正是该词条的html代码(对于大多数静态网页来说是这样的),在谷歌chrome浏览器中按F12功能键k也可以看到该网页的源代码。HTML解析器的作用就是从这标签与文字齐飞的代码中抽丝剥茧,将有用的信息提取出来。
我们接下来想要提取的信息有:
指向其它词条的链接(如下图)
该词条的简介(如下图)
通过对比不同词条的网页代码,我们可以很容易地看出他们都具有一定的相似性,如指向其它词条的链接都是"/item/..."的形式,使用正则表达式很容易jd地j就可以把这些内容给匹配出来。
然而,python往往能给我们提供更加便利的工具。BeautifulSoup就是一个专门用来从html和xml文档中提取数据的库,现在的版本是bs4。除了BeautifulSoup之外,python还具有一些其它的库,如HTMLParser等,作用都差不多。解析器结合正则表达式,很容易将我们所需要的内容提取出来。
首先安装BeautifulSoup:
$pip install beautifulsoup4
在python环境下导入字符串,创建BeautifulSoup对象:
from bs4 import BeautifulSoup soup = BeautifulSoup(html_str, 'lxml', from_encoding='utf-8')
BeautifulSoup可以将复杂的html文档转化成树形结构,每个节点都是pyhton对象,所有的对象可以归纳为4种:
Tag
NavigableString
BeautifulSoup
Comment
Tag和NavigableString是我们最常使用的两种对象,具体选择对象的方法规则颇多,请初学者参考这篇博文Python爬虫利器二之Beautiful Soup的用法。(同时请参考正则表达式学习正则表达式的用法)
根据上图我们可以看到,HtmlParser将要接收一个字符串,输出data和新采集到的一些urls。之前写过的add_new_urls()函数接受一个可迭代对象,所以这里新的urls我们采用集合的形式(也可采用列表的形式)返回,data采用字典的形式存储并返回。
此外,我们观察到,词条内容中含有的链接为"/item/..."的形式,这并不是一个完整的url,要在前面加上“https://baike.baidu.com”进行补全,利用urlparse模块可以很方便地完成这个任务(当然也可以使用拼接字符串的方式)。
领取专属 10元无门槛券
私享最新 技术干货