查看原文
其他

scrapy中Xpath表达式总结

大邓 大邓和他的Python 2019-04-26

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

精选文章

我是如何通过python挣外快的 

现阶段“有趣”对我很重要的    

自然语言处理之LDA主题模型    

100G 文本分析语料资源(免费下载)      

jsonlines库:高效率的保存多个python对象

15个最好的数据科学领域Python库    

使用Pandas更好的做数据科学

抓取8w技能交换公告信息

【视频讲解】Scrapy递归抓取简书用户信息     

大邓强力推荐-jupyter notebook使用小技巧       

数据清洗 常用正则表达式大全

PySimpleGUI: 开发自己第一个软件

Python 3.7中dataclass的终极指南(一) 

Python 3.7中dataclass的终极指南(二) 

[计算消费者的偏好]推荐系统与协同过滤、奇异值分解

机器学习: 识别图片中的数字

应用PCA降维加速模型训练

如何从文本中提取特征信息?

文本数据标注工具-YEDDA

使用sklearn做自然语言处理-1 

使用sklearn做自然语言处理-2

Python圈中的符号计算库-Sympy

Python中处理日期时间库的使用方法 


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存