scrapy xpath空列表_爬虫SCRAPY之函数

本文详细介绍了Scrapy中XPath选择器、CSS选择器以及正则表达式的使用方法。通过实例演示了如何提取网页数据,包括节点文本、属性以及使用回调函数处理响应。同时,文章还提到了Scrapy的Downloader Middleware和Item Pipeline,阐述了它们在数据处理流程中的作用,并给出具体实现示例。
摘要由CSDN通过智能技术生成

#coding:utf-8

#Scrapy提供了自己的数据提取方法Selector。基于lxml来构建的,支持XPath 选择器、css 选择器以及正则表达式.

#利用Selector 这个类来构建一个选择器对象,然后调用它的相关方法如xpath()、css()等来提取数据。

fromscrapy import Selector

body = 'Hello World'

selector = Selector(text=body)

title = selector.xpath('//title/text()').extract_first()

print(title)#Hello World

#Scrapy 的回调函数中的参数rsponse 直接调用xpath()或者css()方法来提取数据,借助Scrapy shell 来模拟Scrapy 请求

# 的过程,来讲解相关的提取方法。https://docs.scrapy.org/en/latest/_static/selectors-sample1.html 。

#开启Scrapy shell,在命令行输入如下命令:

scrapy shell https://docs.scrapy.org/en/latest/_static/selectors-sample1.html

#Scrapy 发起了一次请求,请求的URL,然后把一些可操作的变量传递给我们,如request、response 等,

#在命令行模式下输入命令调用对象的一些操作方法,回车之后实时显示结果。这与Python 的命令行交互模式是类似的。

'http://example.com/' />

Example website
id= 'images'>

   'image1.html'>Name: My image 1 'image1_thumb.jpg' />

   'image2.html'>Name: My image 2 'image2_thumb.jpg' />

   'image3.html'>Name: My image 3 'image3_thumb.jpg' />

   'image4.html'>Name: My image 4 'image4_thumb.jpg' />

   'image5.html'>Name: My image 5 'image5_thumb.jpg' />

#XPath 选择器

response 有一个属性selector,调用response.selector 返回的内容就相当于用response 的body 构造了一个Selector对象。

通过Selector 对象调用解析方法如xpath() 、css()等,通过向方法传入XPath 或css 选择器参数实现信息的提取。

快捷方法 response.xpath()和response.css(),完全等同于response.selector.xpath()和response.selector.css()

结果的形式是Selector组成的列表,Selectorlist 类型, SelectorList 和Selector继续调用xpath()和css()等方法提取数据。

>> result = response.selector.xpath('//a')

>> result

[

    '//a' data='Name: My image...'>, 

    '//a' data='Name: My image...'>,

    '//a' data='Name: My image...'>,

    '//a' data='Name: My image...'>, 

    '//a' data='Name: My image...'>

]

用xpath()方法来提取a 节点包含的img 节点.选择器的最前方加.(点),这代表提取元素内部的数据,如果没有加点,则代表从根节点

开始提取。此处我们用了./img 的提取方式,则代表从a 节点里进行提取。如果此处我们用//img,则还是从html 节点里进行提取。

>>>> result.xpath('./img')

[

    './img' data=''>, 

    './img' data=''>,

    './img' data=''>, 

    './img' data=''>, 

    './img' data=''>

]

得到的是Selectorlist 类型的变量,该变量是由Selector 对象组成的列表。用索引单独取出其中某个Selector 元素:

>>> result[0]

'//a' data='Name: My image...'>

像操作列表一样操作这个Selector list 。Selector 或者Selector list不是真正的文本内容。利用extract()方法:

>>> result.extract()

[

    'Name: My image 1 ', 

    'Name: My image 2 ', 

    'Name: My image 3 ', 

    'Name: My image 4 ', 

    'Name: My image 5 '

]

改写XPath 表达式,来选取节点的内部文本和属性,再加一层/text())获取节点的内部文本,或者加一层/@href 获取节点的

href 属性。其中,@符号后面内容就是要获取的属性名称。

>>> response.xpath('//a/text()').extract()

['Name: My image 1 ', 'Name: My image 2 ', 'Name: My image 3 ', 'Name: My image 4 ', 'Name: My image 5 ']

>>> response.xpath('//a/@href').extract()

['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

用一个规则把所有符合要求的节点都获取下来,返回的类型是列表类型。如果符合要求的节点只有一个:

>>>response.xpath('//a[@href="image1.html"]/text ()').extract()

['Name: My image 1 ']

想要的数据就是第一个元素内容,通过加一个索引来获取:

>>>response.xpath('//a[@href="image1.html"]/text()').extract()[0]

'Name: My image 1 '

extract()后的结果可能是一个空列表。用索引来获取,可能导致数组越界。专门提取单个元素extract_first()。

>>>response.xpath('//a[@href="image1.html"]/text()').extract_first()

'Name: My image 1 '

extract_first()方法设置一个默认值参数,这样当XPath 规则提取不到内容时会直接使用默认值。

>>>response.xpath('//a[@href="image1"]/text()').extract_first()

>>>response.xpath('//a[@href="image1"]/text()').extract_first('Default Image')

'Default Image'

如果XPath 匹配不到任何元素,调用extract_first())会返回空, 也不会报错。

传递了一个参数当作默认值,如Default Image。如果XPath匹配不到结果的话,返回值会使用这个参数来代替。

#CSS选择器

# 使用response.css()方法可以使用css 选择器来应择对应的元素。

>>>response.css('a')

[

    'descendant-or-self::a' data='Name: My image...'>, 

    'descendant-or-self::a' data='Name: My image...'>, 

    'descendant-or-self::a' data='Name: My image...'>, 

    'descendant-or-self::a' data='Name: My image...'>, 

    'descendant-or-self::a' data='Name: My image...'>

]

extract()方法就可以提取出节点

>>>response.css('a').extract()

[

    'Name: My image 1 ', 

    'Name: My image 2 ', 

    'Name: My image 3 ', 

    'Name: My image 4 ', 

    'Name: My image 5 '

]

属性选择和嵌套选择

>>>response.css('a[href="image1.html"]').extract()

['Name: My image 1 ']

>>>response.css('a[href="image1.html"] img').extract()

['']

extract_first()方法提取列表的第一个元素

>>>response.css('a[href="image1.html"] img').extract_first()

''

节点的内部文本和属性的获取,获取文本和属性需要用::text 和::attr()的写法。如Beautiful Soup或pyquery都有单独的方法。

>>>response.css('a[href="image1.html"]::text').extract_first()

'Name: My image 1 '

>>>response.css('a[href="image1.html"] img::attr(src)').extract_first()

'image1_thumb.jpg'

嵌套选择。我们可以先用XPath 选择器选中所有a 节点,再利用css 选择器选中img 节点,再用XPath 选择器在取属性

>>>response.xpath('//

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值