小白学 Python 爬虫(35):爬虫框架 Scrapy 入门基础(三) Selector 选择器 (2)

小白学 Python 爬虫(35):爬虫框架 Scrapy 入门基础(三) Selector 选择器

Xpath 选择器

目前我们在 Scrapy shell 之中,这里我们主要操作的对象是 response 。

response 有一个属性是 selector ,我们可以通过调用 response.selector.xpath 对数据进行获取,同时, Scrapy 为我们提供了两个更加简洁的方法, response.xpath() 和 response.css() ,这两个方法完全等同于 response.selector.xpath() 和 response.selector.css() 。

出于写法上的简便考虑,小编后续的代码将全部使用 response.xpath() 和 response.css() 。

首先,我们简单的获取一下 a 标签:

>>> result = response.xpath('//a') >>> result [<Selector xpath='//a' data='<a href="http://www.likecs.com/image1.html">Name: My image ...'>, <Selector xpath='//a' data='<a href="http://www.likecs.com/image2.html">Name: My image ...'>, <Selector xpath='//a' data='<a href="http://www.likecs.com/image3.html">Name: My image ...'>, <Selector xpath='//a' data='<a href="http://www.likecs.com/image4.html">Name: My image ...'>, <Selector xpath='//a' data='<a href="http://www.likecs.com/image5.html">Name: My image ...'>] >>> type(result) <class 'scrapy.selector.unified.SelectorList'>

这里我们获取到的结果是由 Selector 组成的列表: SelectorList 。

它的类型是 scrapy.selector.unified.SelectorList 。

SelectorList 和 Selector 都可以继续调用 xpath() 和 css() 等方法来进一步提取数据。

接着上面的例子,我们继续尝试获取 a 标签中的 img 标签:

>>> result.xpath('./img') [<Selector xpath='./img' data='<img src="http://www.likecs.com/image1_thumb.jpg">'>, <Selector xpath='./img' data='<img src="http://www.likecs.com/image2_thumb.jpg">'>, <Selector xpath='./img' data='<img src="http://www.likecs.com/image3_thumb.jpg">'>, <Selector xpath='./img' data='<img src="http://www.likecs.com/image4_thumb.jpg">'>, <Selector xpath='./img' data='<img src="http://www.likecs.com/image5_thumb.jpg">'>]

这里我们获取到了所有的 a 标签中的 img 标签。

注意: 选择器的最前方加 .,这代表提取元素内部的数据,如果没有加点,则代表从根节点开始提取。

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

现在我们已经获得了 Selector 类型的节点 a ,如果我们想要将 a 节点元素提取出来,可以使用 extract() 方法,如下:

>>> result.extract() ['<a href="http://www.likecs.com/image1.html">Name: My image 1 <br><img src="http://www.likecs.com/image1_thumb.jpg"></a>', '<a href="http://www.likecs.com/image2.html">Name: My image 2 <br><img src="http://www.likecs.com/image2_thumb.jpg"></a>', '<a href="http://www.likecs.com/image3.html">Name: My image 3 <br><img src="http://www.likecs.com/image3_thumb.jpg"></a>', '<a href="http://www.likecs.com/image4.html">Name: My image 4 <br><img src="http://www.likecs.com/image4_thumb.jpg"></a>', '<a href="http://www.likecs.com/image5.html">Name: My image 5 <br><img src="http://www.likecs.com/image5_thumb.jpg"></a>']

这里我们如果想要获得内容的文本内容,可以使用 /text() ,如果想要获取 href 属性的内容可以使用 /@href 。

我们来看一个完整的示例:

>>> response.xpath('//a[@href="http://www.likecs.com/image1.html"]/text()').extract() ['Name: My image 1 ']

这里我们限制的结果,只查到的一条数据,很多情况下我们都会获得多条数据,这时如果想获取第一个元素的内容,可以使用索引的方式,如下:

>>> response.xpath('//a/text()').extract()[0] 'Name: My image 1 '

这样其实有一点点的小问题,如果当前我们需要的列表为空,这里直接会产生数组越界的异常。

Scrapy 为我们提供了另一个方法 extract_first() ,专门用来解决这个问题,上面的示例可以改写成下面的样子:

>>> response.xpath('//a/text()').extract_first() 'Name: My image 1 '

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

>>> response.xpath('//a[@href="image1"]/text()').extract_first('Default') 'Default' CSS 选择器

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjzdp.html