scrapy中Xpath表达式总结

  • A+
所属分类:Python 技术杂谈

xpath是一门在XML文档中查找指定信息的标记语言,可以对XML文档中的元素和属性使用路径表达式来进行定位(导航)。

xpath常用语法

/          选择某个标签下的所有内容
text()     选择标签内所包含的文本
@          选择标签属性信息
//         选择所有标签
[@属性=值]  该标签属性满足一定条件

注意上面所有的操作,返回的结果都是HtmlResponse类,该类可以通过xpath()方法提取出信息。

response.xpath('/html/body/div/p').extract()
#['<p>This domain ... permission.</p>', '<p><a href="http://www.baidu.com>Baidu</a>"']

常见任务示例

下面我们作说明性示例。

  • 选择所有的p元素

//p

  • 找到div下面所有的链接(a元素)
//div//a

  • 找到所有的a元素中的链接
//a/@href

  • 找到a元素,该a元素的href值不含有abc
//a[not(contains(@href, 'abc))]

  • 找到a元素,该a元素的href以http://www.开头
//a[starts-with(@href, 'http://www.')]

  • 获取id为 "firstTtile" 的h1标签下的a中的text()
//h1[@href="firstTtile"]/a/text()

  • 获取id为"dov"的div标签内的ul中a元素里的所有连接(href值)。
//div[@id="dov"]/ul//a/@href

  • 获取class属性包含"rrr"以及class属性包含"yyy"的任意元素内所有h1中的文本。
//*[contains(@class, "rrr") and contains(@class, "yyy")]//h1//text()

  • 选择元素包含"HelloPython"文本的元素之后的div元素中所有的链接(href值)
//*[text()="HelloPython"]/../following-sibing::div//a/@href

注意在scrapy中上面的所有的操作,返回的结果都是HtmlResponse类,该类可以通过xpath()方法提取出信息。例如

response.xpath('/html/body/div/p').extract()
#['<p>This domain ... permission.</p>', '<p><a href="http://www.baidu.com>Baidu</a>"']

考虑网页变化

Xpath表达式有时候会因为网站改版而失效,所以我们设计xpath时候应该多注意这方面事情,尽量降低这方面的设计问题。一些简单的的规则能降低这方面的风险:

避免使用索引值

//div/div/div[1]/div[2]/div[1]/div[1]/a/img

上面的xpath表达式不仅不稳健,而且难于阅读和理解。我们应该尽量使用接近img标签的表达式,借助id或者class属性,如

//div[@class="picture"]/a/img

class有时候不靠谱,由于css会用class来控制页面外观,所以网站会存在微小的布局调整,导致class属性值是变化的。例如下面的class

//div[@class="thumbnail"]/a/img

一段时间后,可能变成:

//div[@class="preview blue"]/a/img

id往往更可靠,一般来说,id属性是具有唯一标识的标签属性,不容易改动。所以用id表示的xpath表达式更稳健

//*[@id="more_detail"]//text()

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: