一、看官网上说明
“ Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库. 它能够通过你喜欢的转换器实现惯用的文档导航, 查找, 修改文档的方式. Beautiful Soup会帮你节省数小时甚至数天的工作时间.
“ XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。
二、从原理上区别
BeautifulSoup是一个第三方的Python库,BeautifulSoup是用python写的XPath是一门语言,技术。xpath是用c写的
BeautifulSoup和XPath的原理不一样,BeautifulSoup是基于DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多。而lxml只会局部遍历。
三、如何使用
xpath 要求一定清楚文档层次结构,它通过元素和属性进行导航,可以使用绝对路径或相对路径查找,而beautifulsoup 不必清楚文档结构,可以直接找某些标签,简单粗暴。
打个比方,如果我们要找这个地址:移动互联网创新园(上海)
如用正则表达式的话,是这样描述的:它是北边是复旦软件园,门口是高架轻轨线...
如用XPath来描述的话是:它在 上海市 宝山区 逸仙路 2816号。(从大到小,绝对路径)
举栗子说明,获取简书首页的热门文章:
首先分析一下首页html文档结构:
分析一下,我们看到:
- 文章标题是包含在h4标签下面的a标签中;
- 每篇文章信息(作者,标题,阅读量,喜欢)是在一个ul标签下,有两种样式article-list thumbnails 和have-img,即有缩略图和无图
实现:
- BeautifulSoup:
from bs4 import BeautifulSoup #导入库
#html 是爬取的网页源代码, 将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象
soup = BeautifulSoup(html,'html.parser',from_encoding='utf-8')
#查找所有的h4标签
links = soup.find_all("h4")
for link in links:
print link
- XPath
from lxml import etree
selector = etree.HTML(html)
links = selector.xpath('//h4/a/text()')
for link in links:
print link
可以使用Chrome的审核元素功能来找到我们所需要提取内容的xpath
注意:copy出来的path:
//*[@id="list-container"]/ul[2]/li[1]/div/h4/a
是指向一个指定的内容,对比一下文档结构,如果需要提取所有文章信息(需要循环的部分),如何修改?
以上两段代码都提取到首页所有文章,打印输出的形式也不一样,soup.find_all("h4")找到的是包含文章标题和链接的所有h4标签(包含标签),selector.xpath('//h4/a/text()')找到的是h4标签下a标签中的文字内容(text())。