Python 培训(爬虫)bs4解析器

说明

  • 所谓解析器,就是从爬起的 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插件快速发布