Scrapy爬虫——xpath与css选择器详解

有条件的请支持慕课实战正版课程,本blog仅仅是归纳总结,自用。

一、xpath部分

1.1 xpath简介

Scrapy爬虫——xpath与css选择器详解_第1张图片
xpath简介.png

1.2 xpath语法

  • 子元素:仅仅指节点下面一层的元素
  • 后代元素:指标签下面任意层级的元素
  • 父元素、祖先(先辈)元素同理。
Scrapy爬虫——xpath与css选择器详解_第2张图片
xpath语法图

1.3 xpath谓语语法

谓语(Predicates)谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。

Scrapy爬虫——xpath与css选择器详解_第3张图片
xpathwei'yu

1.4 xpath其他语法

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。
Scrapy爬虫——xpath与css选择器详解_第4张图片
xpath其他语法

二、css选择器

Scrapy爬虫——xpath与css选择器详解_第5张图片
css选择器
Scrapy爬虫——xpath与css选择器详解_第6张图片
css选择器2
Scrapy爬虫——xpath与css选择器详解_第7张图片
css选择器3

三、scrapy选择器实战

  • Scrapy选择器构建于 lxml 库之上,这意味着它们在速度和解析准确性上非常相似。
  • 我们将使用 Scrapy shell
    (提供交互测试)和位于Scrapy文档服务器的一个样例页面,来解释如何使用选择器:
    http://doc.scrapy.org/en/latest/_static/selectors-sample1.html

这里是它的HTML源码:


 
  
  Example website
 
 
  
 

3.1 构造选择器

首先, 我们打开shell:

scrapy shell http://doc.scrapy.org/en/latest/_static/selectors-sample1.html
  • 接着,当shell载入后,您将获得名为response
    的shell变量,其为响应的response, 并且在其 response.selector属性上绑定了一个 selector
  • 因为我们处理的是HTML,选择器将自动使用HTML语法分析。
  • 那么,通过查看 HTML code 该页面的源码,我们构建一个XPath来选择title标签内的文字:
>>> response.selector.xpath('//title/text()')
[]
  • 由于在response中使用XPath、CSS查询十分普遍,因此,Scrapy提供了两个实用的快捷方式: response.xpath()response.css():
>>> response.xpath('//title/text()')
[]
>>> response.css('title::text')
[]
  • 如你所见, .xpath().css()方法返回一个类 SelectorList 的实例, 它是一个新选择器的列表。这个API可以用来快速的提取嵌套数据。

  • 为了提取真实的原文数据,你需要调用 .extract()方法如下:

>>> response.xpath('//title/text()').extract()
[u'Example website']
  • 如果想要提取到第一个匹配到的元素, 必须调用 .extract_first() selector:
>>> response.xpath('//div[@id="images"]/a/text()').extract_first()
u'Name: My image 1 '
  • 现在我们将得到根URL(base URL)和一些图片链接:
>>> response.xpath('//base/@href').extract()
[u'http://example.com/']

>>> response.css('base::attr(href)').extract()
[u'http://example.com/']

>>> response.xpath('//a[contains(@href, "image")]/@href').extract()
[u'image1.html',
 u'image2.html',
 u'image3.html',
 u'image4.html',
 u'image5.html']

>>> response.css('a[href*=image]::attr(href)').extract()
[u'image1.html',
 u'image2.html',
 u'image3.html',
 u'image4.html',
 u'image5.html']

>>> response.xpath('//a[contains(@href, "image")]/img/@src').extract()
[u'image1_thumb.jpg',
 u'image2_thumb.jpg',
 u'image3_thumb.jpg',
 u'image4_thumb.jpg',
 u'image5_thumb.jpg']

>>> response.css('a[href*=image] img::attr(src)').extract()
[u'image1_thumb.jpg',
 u'image2_thumb.jpg',
 u'image3_thumb.jpg',
 u'image4_thumb.jpg',
 u'image5_thumb.jpg']

3.2选择器嵌套

  • 选择器方法( .xpath() or .css() )返回相同类型的选择器列表,因此你也可以对这些选择器调用选择器方法。下面是一个例子:
>>> links = response.xpath('//a[contains(@href, "image")]')
>>> links.extract()
[u'Name: My image 1 
![](image1_thumb.jpg)
', u'Name: My image 2
![](image2_thumb.jpg)
', u'Name: My image 3
![](image3_thumb.jpg)
', u'Name: My image 4
![](image4_thumb.jpg)
', u'Name: My image 5
![](image5_thumb.jpg)
'] >>> for index, link in enumerate(links): args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract()) print 'Link number %d points to url %s and image %s' % args Link number 0 points to url [u'image1.html'] and image [u'image1_thumb.jpg'] Link number 1 points to url [u'image2.html'] and image [u'image2_thumb.jpg'] Link number 2 points to url [u'image3.html'] and image [u'image3_thumb.jpg'] Link number 3 points to url [u'image4.html'] and image [u'image4_thumb.jpg'] Link number 4 points to url [u'image5.html'] and image [u'image5_thumb.jpg']

3.3 结合正则表达式使用选择器(selectors)

  • Selector 也有一个 .re()方法,用来通过正则表达式来提取数据。然而,不同于使用 .xpath() 或者 .css() 方法, .re() 方法返回unicode字符串的列表。所以你无法构造嵌套式的 .re() 调用。

  • 下面是一个例子,从上面的 HTML code 中提取图像名字:

>>> response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
[u'My image 1',
 u'My image 2',
 u'My image 3',
 u'My image 4',
 u'My image 5']
  • 另外还有一个糅合了 .extract_first().re() 的函数 .re_first() . 使用该函数可以提取第一个匹配到的字符串:
>>> response.xpath('//a[contains(@href, "image")]/text()').re_first(r'Name:\s*(.*)')
u'My image 1'

你可能感兴趣的:(Scrapy爬虫——xpath与css选择器详解)