在网络爬虫中,对于HTML的解析,XPath是一种常用的方法。XPath 最初是用于XML中,其主要使用路径表达式在 XML 文档中进行导航。用于HTML中主要是因为HTML和XML非常的相似:
它们具有类似的文件结构。都有唯一的根元素。都采用标签的方式。
同时又有点不同:
XML可以自定义标签而HTML的标签是确定的
XML用于描述数据(和JSON一样)而HTML用于显示数据(经过浏览器处理)
XPath的解析需要依赖于"lxml"库。为了方便我们可以在谷歌浏览器安装XPath插件:xpath.crx 。使用xpath必须对HTML具有一定的了解。
用于网络爬虫的XPath主要使用以下语法:
操作 | 意义 | 示例 | 备注 |
---|---|---|---|
./ | 从当前结点开始 | ./div | 选取当前结点之后的直接结点div |
// | 从任意结点开始 | //div | 选取所有的div |
@ | 选取属性 | //div[@class = "my"] | 选取class = "my"的div结点 |
@ | 选取属性 | //div[@class] | 选取所有有class属性的div |
* | 任意匹配 | //div/* | div元素下的任意元素 |
一般在爬虫中主要进行的操作如下:
操作 | 示例 | 备注 |
---|---|---|
属性定位 | //input[@class="bg s_btn"] | 必须把类bg和s_btn全部写进去 |
索引定位 | //div[@id=''head"]/div/div[2]/a[1] | 索引下标起始是1 |
层级定位 | //div[@id=''head"]/div/div/ | 按照层级一级一级查找 |
逻辑运算 | //input[@class="sss" and @id = "hhh"] | 同时具有两个属性的元素 |
模糊匹配 | //input[contains(@class,'s')] | contains函数:class属性包含s的所有input元素 |
模糊匹配 | //input[start_with(@class,'s')] | start_with函数:以s开头的具有class属性的所有input元素 |
取文本 | //div[@id='u1']/a[5]/text() | 取第五个a元素的文本 |
取属性 | //div[@id='u1']/a[5]/@href | 取第五个a元素的属性 |
使用示例:
from lxml import etree #先导入库文件
XPath使用方法主要有两种:
(1)本地文件
tree = etree.parse("test.html")#写入本地文件的路径
ret = tree.xpath('//div[@id="u1"]/a[5]/@href')#注意单引号和双引号的使用
(2)网络文件
r = requests.get(url)
tree = etree.THML(r.text) #注意这里是方法HTML(),并且放入对象的文本
XPath还可以用于返回的对象
#取返回class = "my"的div列表的第一个
first_div = tree.xpath('//div[@class = "my"]')[1]
#取出当前结点后所有具有class = "son"属性的div下的p的文本
p_text = first_div.xpath('.//div[@class = "son"]/p/text()')#注意双斜线前边的点
jsonpath的使用https://www.cnblogs.com/angle6-liu/p/10580792.html
网友评论