欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Scrapy中xpath的使用

程序员文章站 2022-03-03 07:59:17
...

对html的结构可以设想为一棵大树,根节点是html,然后开始分叉为head,body,其中每个节点上有自己属性特点。对于xpath使用的总结比较多,我也是东抄一下西抄一下提供大的方向

child::book 选取所有属于当前节点的子元素的 book 节点。
attribute::lang 选取当前节点的 lang 属性。
child::* 选取当前节点的所有子元素。
attribute::* 选取当前节点的所有属性。
child::text() 选取当前节点的所有文本子节点。
child::node() 选取当前节点的所有子节点。
descendant::book 选取当前节点的所有 book 后代。
ancestor::book 选择当前节点的所有 book 先辈。
ancestor-or-self::book 选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点)
child::*/child::price 选取当前节点的所有 price 孙节点。

通过绝对路径或者相对路径进行定位

response.xpath('html/body/div/input')

通过索引来进行定位

response.xpath('//input[3]')

通过属性来定位

response.xpath("//input[@id='kw1' and @name='wahah']")

使用内置方法来定位

# 方法比较多 参见内置方法的链接
response.xpath("//input[start-with(@id,'nice')]")
response.xpath("//input[ends-with(@id,'fds')]")
response.xpath("//input[contains(@id,'haha')]")
response.xpath("//input[not(@)]")

当然获取了selector对象,你可以接着使用xpath对象来定位元素,记得前面使用'./'

为了提取真实的原文数据,你需要调用 .extract()

# 正则方法re返回的是unicode列表,无法继续使用selector特性
response.xpath("//input[not(@)]").re(r'.*')
response.xpath("//input[not(@)]").extract()

链接:
内置方法 http://www.w3school.com.cn/xpath/xpath_functions.asp#qname