Scrapy元素选择器Xpath用法汇总

作者:思维之上 时间:2021-09-11 11:42:58 

 众所周知,在设计爬虫时,最麻烦的一步就是对网页元素进行分析,目前流行的网页元素获取的工具有BeautifulSoup,lxml等,而据我使用的体验而言,Scrapy的元素选择器Xpath(结合正则表达式)是其中较为出色的一种(个人认为最好啦,当然只能在Scrapy中使用)功能相对较全、使用较为方便,正因为它的丰富性,有时很多功能会忘记,所以在这里整理好记录下来,方便今后查阅使用。

1. 元素的多级定位与跳级定位

多级定位:依靠html中的多级元素逐步缩小范围


response.xpath('//table/tbody/tr/td')

//如果知道元素所属的下标可以用下标选择
response.xpath('//table/tbody/tr[1]/td')

跳级定位:符号“//”表示跳级定位,即对当前元素的所有层数的子元素(不仅是第一层子元素)进行查找,一般xpath的开头都是跳级定位


response.xpath('//span//table')

2. 依靠元素的属性定位

每个html元素都有很多属性,如id、class、title、href、text(href和text往往可以配合正则表达式)等,这些属性往往具有很强的特殊性,结合元素多级定位或跳级定位会更准确高效,下面举几个典型的例子,其他的举一反三

利用class定位


response.xpath('//td[@class="mc_content"]')

利用href配合正则表达式定位


response.xpath('//a[re:test(@href,"^\/index\.php\?m=News&a=details&id=1&NewsId=\d{1,4}")]')

利用text结合正则表达式定位


a=response.xpath('//a[re:test(text(),"\w{4}")]')

此外,xpath还有对于html元素操作的两个实用的函数(可以用正则表达式代替)——starts-with和contains;


a=response.xpath('//a[starts-with(@title,"注册时间")]')

a=response.xpath('//a[contains(text(),"闻")]')

3. 提取元素或元素的属性值

首先是最基本的extract()函数,提取被定为的元素对象


a=response.xpath('//a[contains(text(),"闻")]').extract()

//如果被定为的元素对象有多个,可以有用下标指定
a=response.xpath('//a[contains(text(),"闻")]').extract()[1]

提取元素的属性


//提取text
a=response.xpath('//a[contains(text(),"闻")]/text()').extract()

//获取href
a=response.xpath('//a[contains(text(),"闻")]/@href').extract()

//获取name
a=response.xpath('//a[contains(text(),"闻")]/@name').extract()

此时我们的正则表达式又闲不住了(scrapy自带的函数),可以对提取的元素进行选择


//对href中的部分字符串进行选择
response.xpath('//a[@name="_l_p_n"]/@href').re('\/s.*?list\.htm')

在这里关于xpath的所有用法基本总结完毕,只是由于xpath是对静态元素进行匹配选择,对于javascript往往束手无策,这时不得不用一个自动化测试工具——selenium,可以实现各种动态事件和静态元素的选择,只是selenium往往比较吃内存,响应时间也比较慢,对于大型的爬虫任务尽量不要使用,毕竟有一些javascript元素是内嵌在网页代码中的,这时候结合万能的正则表达式,xpath往往能够实现。如下:


link = re.search("javascript:goToPage\('(.*?)'", value) //value为包含该段的字符串

来源:https://blog.csdn.net/manongpengzai/article/details/77109600

标签:Scrapy,Xpath
0
投稿

猜你喜欢

  • Python过滤txt文件内重复内容的方法

    2023-08-04 17:41:48
  • ThinkPHP3.1.2 使用cli命令行模式运行的方法

    2023-11-14 12:56:27
  • Python import与from import使用及区别介绍

    2022-05-17 12:09:19
  • sql如何在Access中选择指定日期前的记录?

    2010-06-17 12:47:00
  • ORACLE 如何查询被锁定表及如何解锁释放session

    2023-07-02 11:59:39
  • 详解opencv中画圆circle函数和椭圆ellipse函数

    2023-08-10 22:11:40
  • python使用MQTT给硬件传输图片的实现方法

    2022-02-09 21:55:59
  • python设计模式之抽象工厂模式详解

    2023-06-11 22:15:51
  • python 多线程threading程序详情

    2021-03-23 10:07:34
  • CSS背景 background 图像属性解读

    2008-08-01 18:19:00
  • Python学生成绩管理系统简洁版

    2023-08-23 01:33:08
  • 用户界面设计中“状态”和“动作”的表达

    2011-01-06 12:36:00
  • Asp定时执行操作、各种网页定时操作详解

    2008-06-10 17:32:00
  • python绘制地震散点图

    2021-12-21 13:09:08
  • 一个很棒的js图片代码

    2009-12-17 18:36:00
  • 详解django中url路由配置及渲染方式

    2021-04-29 01:28:50
  • IE8 的 noscript 标签 Bug

    2009-08-18 12:37:00
  • Python文本特征抽取与向量化算法学习

    2023-07-19 09:44:29
  • 浅谈python中真正关闭socket的方法

    2023-11-02 15:41:56
  • 一文带你熟悉Go语言中函数的使用

    2023-07-13 08:22:23
  • asp之家 网络编程 m.aspxhome.com