分享

scrapy中Xpath表达式总结

 大邓的Python 2021-02-23

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()

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多