所谓解析器,就是从爬起的 html 文档中获取信息的一个方法。获取信息可以用正则表达式,但是比较麻烦。基于 html 树状标签结构,有很多解析器,可以很方便我们定位、获取信息。
学习解析器,需要一丢丢 html 基础,也有很多类型的解析器,这里讲一个我觉得最好用的解析器:BeautifulSoup
不仅需要 pip 安装 beautifulsoup,还需要安装一个 lxml,这个可以提高性能。
和前面的都不一样,BeautifulSoup 不是根据字符串建立的,而是可以用下面的方式直接得到。(当然,也可以直接传入字符串)
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.read(), 'lxml')
response 就是用 urllib 打开的网页,之前我们都要先 read() 和 decode()。在这里,我们只需要 read(),解析器会自动去猜测解码方式。自动猜测,果然方便很多。
lxml 是官方推荐的解析器,我们这么写就行了,应该是内部算法不一样。
还有两个参数,exclude_encoding 排除不正确的编码,from_encoding 直接确定使用这个编码。
soup = BeautifulSoup(response.read(), 'lxml', exclude_encodings=['iso-8859-7', 'gb2312'])
还有一个非常好的函数 prettify,可以让读到的内容重新排版,变得易读。
content = soup.prettify()
首先值得一提的是,这里得到的结果,不是字符串,而是一个可以继续向下迭代的对象。
下面两种方法等价获取第一个标签:
soup.div
soup.find('div')
用以下代码可以获取有特定属性的标签:
soup.find(id='home') # 获取 id 为 home 的标签
soup.find('div', attrs={'id': 'home', 'class': 'title'})
用以下代码查找所有的标签,参数与 find 一样
soup.find_all('div')
soup.find_all('div')[1]
用 parent 可以获取其父节点
soup.div.parrent
上面都是筛选标签,将含有信息的标签找出来了,就可以从里面获取信息了。
下面两种方法都可以获取标签里面属性的值:
soup.div['class']
soup.div.get('class')
# 得到的是数组
下面两种方法都可以获取文本内容:
soup.div.string
soup.div.get_text()
可以看出来,其实解析器都差不多,但是 bs4 实际操作起来感觉更亲和,而且 bs4 有 prettify 函数,这确实比较好用。
本文章使用limfx的vsocde插件快速发布