lxml的安装
使用pip安装
pip install lxml
关于lxml
lxml使用的是Xpath语法,而且使用的是C语言编写,比不使用lxml解析器的BeautifulSoup快一些。
Xpath是一门在XML文档中查找信息的语言。Xpath使用路径表达式来选取XML文档中的节点或节点集,也可以用在HTML获取数据中。
import requests
from lxml import etree
link = "http://www.santostang.com/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/70.0.3538.25 \
Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400 ',
'Host': 'www.santostang.com'
}
r = requests.get(link, headers=headers)
html = etree.HTML(r.text) #解析为lxml格式
title_list = html.xpath('//h1[@class="post-title"]/a/text()')
print(title_list)
和BeautifulSoup类似,使用lxml的时候需要先用html=etree.HTML(r.text)解析为lxml格式,然后用Xpath读取里面的内容。
其中,"//h1"
表示选取所有<h1>
子元素,"//"
无论文档在什么位置,后面加上[@class="post-title"]
表示选取<h1>
中class为"post-title"
的元素,/a
表示选取<h1>
子元素的<a>
元素,text()
表示提取<a>
元素中的所有文本。
我们可以使用浏览器的“检查”方法快速获得一个元素的Xpath:
选中一个元素——>右键——>Copy——>Copy Xpath
表达式
| 描述
|
---|---|
nodename
| 选取此节点的所有子节点。
|
/
| 从根节点选取。
|
//
| 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
|
.
| 选取当前节点。
|
..
| 选取当前节点的父节点。
|
@
| 选取属性。
|
下面是一个XML文档:
<bookstore>
<book>
<title>HarryPotter</title>
<author>JK.Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
路径表达式
| 结果
|
---|---|
bookstore
| 选取 bookstore 元素的所有子节点。
|
/bookstore
| 选取根元素 bookstore。
注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
|
bookstore/book
| 选取属于 bookstore 的子元素的所有 book 元素。
|
//book
| 选取所有 book 子元素,而不管它们在文档中的位置。
|
bookstore//book
| 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
|
//@lang
| 选取名为 lang 的所有属性。
|