Scrapy中XPath选择器的基本用法

Scrapy中XPath选择器的基本用法

    • 1、前言
    • 2、多级定位和跳级定位标签元素
      • 1. 多级定位
      • 2. 跳级定位
    • 3. 利用属性更加准确的定位标签
    • 4. 提取定位标签中的text信息
    • 5. 提取定位标签中的属性信息
    • 6. 参考资料

1、前言

本文是作为爬虫项目实战一:基于Scrapy+MongDB爬取并存储糗事百科用户信息的补充,所以本文的网页选择也是基于糗事百科展开。XPath主要使用在XML文档中选择节点,同时XPath也适用于HTML。网页中,标签元素的关系有:先辈节点、父节点、子节点、同级节点、后辈节点。XPath用法很多,这里不会全部列出来,主要是列出来了,上篇blog中使用过的一些方法进行总结。如果不对之处,还望批评指正。想更详细了解用法,请参考W3CSchool XPath教程和官方文档
注意以下代码截图都是基于糗事百科网址(https://www.qiushibaike.com/hot/page/1/),同时测试代码实在Pycharm中进行,通过配置scrapy settings中的请求中添加User-Agent字段,然后在Pycharm的Terminal终端输入scrapy shell https://www.qiushibaike.com/hot/page/1/ 命令进入交互模式进行。
如下图:
Scrapy中XPath选择器的基本用法_第1张图片

2、多级定位和跳级定位标签元素

1. 多级定位

从根节点开始选择定位,通常是以"/"开头,返回所有匹配的子节点选择器列表。
例如:我要定位下面的body标签。
Scrapy中XPath选择器的基本用法_第2张图片
那么多级定位的写法应该是:r = response.xpath(’/html/body’),这里找到了一个,所以返回的是包含一个选择器元素的列表。
Scrapy中XPath选择器的基本用法_第3张图片
再比如,r = response.xpath(’/html/body/div’),这里会返回包含5个选择器元素的列表,第一个div没有被捕获,可能是因为里面涉及到了js,具体原因自己还没有弄明白。(有知道的大佬,希望能评论告知)。

Scrapy中XPath选择器的基本用法_第4张图片
Scrapy中XPath选择器的基本用法_第5张图片

2. 跳级定位

不用从根节点匹配,而是全局匹配,有匹配的结果返回一个选择器列表。通常是以"//"开头。
见下面的示例,注意这个时候会全局去匹配,所以它会去子孙节点中寻找符合调节的标签,全部返回。因此需要准确定位的话,最好先加上一些属性进行定位,后面会讲到。
Scrapy中XPath选择器的基本用法_第6张图片

3. 利用属性更加准确的定位标签

每个html元素都有很多属性,如id、class、title、href、text等,这些属性往往具有很强的特殊性,结合元素多级定位或跳级定位会更准确高效,比如:定位body标签下的id="header"的div标签。
Scrapy中XPath选择器的基本用法_第7张图片
语法就是:r = response.xpath(’//body/div[@id=“header”]’),结果如下。
在这里插入图片描述

4. 提取定位标签中的text信息

首先准确定位到要提取text的标签,然后在后面加上"/text()"即可,调用get()方法或者getall()方法获得。
语法:r = response.xpath(’//head/title/text()’).get()
这是提取head标签下的title节点中的文本信息。
Scrapy中XPath选择器的基本用法_第8张图片
我们再提取第一个用户发表的段子信息。
r = response.xpath(’//div[@class=“col1”]/div’)[0].xpath(’./a/div[@class=“content”]/span/text()’).get()
.xpath(’./a/div[@class=“content”]/span/text()’).get()中的./div代表当前节点下的div节点,依次类推。
Scrapy中XPath选择器的基本用法_第9张图片
在这里插入图片描述
结果我们看到之匹配了第一句,后面的没有匹配。所以这里我们采用getall()方法。
r = response.xpath(’//div[@class=“col1”]/div’)[0].xpath(’./a/div[@class=“content”]/span/text()’).getall()
Scrapy中XPath选择器的基本用法_第10张图片
Ps:注意要检查是否是准确定位,写这篇总结时,发现原来的匹配方式:r = response.xpath(’//div[@class=“col1”]/div’)[0].xpath(’./a/div/span/text()’).getall()会全部两个a标签下div标签中所有span节点的text。(这里重新加载了网页)
Scrapy中XPath选择器的基本用法_第11张图片
Scrapy中XPath选择器的基本用法_第12张图片

综上,在多级选取和跳级选取中要多配合属性等来达到准确定位,其次要注意多余匹配情况的发生,检查结果是否准确!
更精确的提取:
r = response.xpath(’//div[@class=“col1”]/div’)[0].xpath(’./a/div[@class=“content”]/span’)[0].xpath(’./text()’).getall().
在这里插入图片描述

5. 提取定位标签中的属性信息

我们要提取div标签中的class属性值,首先定位到相应的标签,然后在后面加上“/@classs”,调用get()方法或者getall()方法获得。
在这里插入图片描述
在这里插入图片描述

之后这个字符串经过切片等处理,提取出来性别。

6. 参考资料

  1. XPath教程
  2. 官方教程
  3. Scrapy元素选择器Xpath用法汇总
  4. scrapy中的xpath与css选择器

后记:
我从本硕药学零基础转行计算机,自学路上,走过很多弯路,也庆幸自己喜欢记笔记,把知识点进行总结,帮助自己成功实现转行。
如果想和我一起交流学习,欢迎大家关注我的微信公众号No Bug编程笔记,通过扫描下方二维码或者搜索NoBugNotes关注。这个公众号主要是分享和记录自己学习编程的笔记,如:C – > Python – > Java等,后续还会分享自己面试以及职场上的成长心得。
在这里插入图片描述

你可能感兴趣的:(爬虫,Scrapy)