开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
1.什么是Xpath?
了解xpath之前,先了解一下什么lxml,lxml是一款高性能的 Python HTML/XML 解析器,我们可以利用XPath,来快速的定位特定元素以及获取节点信息,主要用在 HTML\XML 文档中查找信息。
xpath的详细学习文档:XPath 教程
2.html和xml的区别
3.xpath中的节点类型
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。
4.xml的结构
5.xpath语法
(1)选中某个元素:结点名字 (2)从根节点选取、或者是元素和元素间的过渡:/ (3)从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置:// (4)选取当前节点:. (5)选取当前节点的父节点:.. (6)选取属性:@ (7)选取文本:选取文本
6.使用xpath的注意点
(1)xpath选取到某个元素以后如果是要获取到文本内容记得在最后面添加上text() (2)使用xpath语法提取出的数据是存放在列表中的,所以如果需要某一个数据记得添加索引 (3)xpath的语法调试要借助xpathhelper这个插件,插件下载地址:pan.baidu.com/share/init?… 密码:337b
7.路径表达式示例:
//title[@lang="eng"] :选择lang属性值为eng的所有title元素
/bookstore/book[1] :选取属于 bookstore 子元素的第一个 book 元素
bookstore/book[last()] :选取属于 bookstore 子元素的最后一个 book 元素
/bookstore/book[last()-1] :选取属于 bookstore 子元素的倒数第二个 book 元素
/bookstore/book[position()>1] :选择bookstore下面的book元素,从第二个开始选择
//book/titleltext()=['Harry Potter'] : 选择所有book下的title元素,仅仅选择文本为Harry Potter的title元素
/bookstore/book[price=35.001]/title :选取 bookstore 元素中的 book 元素的所有 title 元素,目其中的price 元素的值须大于 35.00
8.实例:
下面以豆瓣网为例,提取取出电影的相关数据:
(1)在网页中定位想要的数据:鼠标右击->检查->选择定位器->点击元素定位器以后再点击想要的数据,就可以快速定位到数据在网页中的位置(也可以将鼠标先移动到想要的数据,然后再右击检查,效果是一样的)
(2)打开xpathhelper插件,在里面调试xpath语法:
(3)xpath语法放到代码中:
import requests
from lxml import etree
url = 'https://movie.douban.com/top250'
#构造请求头
headers = {
'Cookie': 'bid=kfhNpVvz_Qo; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1669689589%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DeRVF5hxrT8QJl3EHfpeumyyMeiSuRDx41fZyOSpVyGKC_j0b99k3miUOwctTkW-b%26wd%3D%26eqid%3D9f6e96bf0064410300000004638570f1%22%5D; _pk_id.100001.4cf6=e94d226d06b5c25b.1669689589.1.1669689589.1669689589.; _pk_ses.100001.4cf6=*; ap_v=0,6.0; __utma=30149280.1868740820.1669689589.1669689589.1669689589.1; __utmb=30149280.0.10.1669689589; __utmc=30149280; __utmz=30149280.1669689589.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utma=223695111.1908533795.1669689589.1669689589.1669689589.1; __utmb=223695111.0.10.1669689589; __utmc=223695111; __utmz=223695111.1669689589.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __gads=ID=1964ab8632797b02-227dddfdabd8005a:T=1669689588:RT=1669689588:S=ALNI_MY1_2RksWObFebLKlnn_EoAHvGwwA; __gpi=UID=00000b85a594fd97:T=1669689588:RT=1669689588:S=ALNI_MYqSRQTBfuiJ6YRbkihODdGgIXxfg',
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36" ''
}
res = requests.get(url,headers=headers)
data = res.content.decode()
html_data = etree.HTML(data)
name = html_data.xpath('//span[@class="title"][1]/text()')
print(name)
最后看一下获取到的数据:
这里有人会有疑惑为什么只有25个数据,这个就涉及到了ajax请求的问题,在后面的文章中会分享如何解决