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