selector

简介

待补充

Shell

Scrapy终端,是一个交互终端,供您在未启动spider的情况下尝试及调试您的爬取代码。 其本意是用来测试提取 数据的代码,不过您可以将其作为正常的Python终端,在上面测试任何的Python代码。 该终端是用来测试XPath或CSS表达式,查看他们的工作方式及从爬取的网页中提取的数据。 在编写您的spider时,该 终端提供了交互性测试您的表达式代码的功能,免去了每次修改后运行spider的麻烦。 一旦熟悉了Scrapy终端后,您会发现其在开发和调试spider时发挥的巨大作用。

安装ipython

安装:

pip install ipython

简介:如果您安装了 IPython ,Scrapy终端将使用 IPython (替代标准Python终端)。 IPython 终端与其他相 比更为强大,提供智能的自动补全,高亮输出,及其他特性

进入命令
scrapy shell 目标url
<html><head>
  <base href="http://example.com/">
  <title>Example website</title>
 </head>
 <body>
  <div id="images">
   <a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>
   <a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>
   <a href="image3.html">Name: My image 3 <br><img src="image3_thumb.jpg"></a>
   <a href="image4.html">Name: My image 4 <br><img src="image4_thumb.jpg"></a>
   <a href="image5.html">Name: My image 5 <br><img src="image5_thumb.jpg"></a>
  </div>
</body></html>

Xpath选择器(推荐使用)

基本语法
表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
选取当前节点的父节点。
@ 选取属性。
示例
路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。
>>> result = response.selector.xpath('//a')
>>> result

[
<Selector xpath='//a' data='<a href="image1.html">Name: My image ...'>, 
<Selector xpath='//a' data='<a href="image2.html">Name: My image ...'>,
<Selector xpath='//a' data='<a href="image3.html">Name: My image ...'>, 
<Selector xpath='//a' data='<a href="image4.html">Name: My image ...'>, 
<Selector xpath='//a' data='<a href="image5.html">Name: My image ...'>
]

>>> type(result)
<class 'scrapy.selector.unified.SelectorList'>
>>> result.xpath('./img') # 签名加点.表示从该节点内部选取
[<Selector xpath='./img' data='<img src="image1_thumb.jpg">'>, 
<Selector xpath='./img' data='<img src="image2_thumb.jpg">'>, 
<Selector xpath='./img' data='<img src="image3_thumb.jpg">'>, 
<Selector xpath='./img' data='<img src="image4_thumb.jpg">'>, 
<Selector xpath='./img' data='<img src="image5_thumb.jpg">'>]


>>> result = response.xpath('//a')
>>> result
[<Selector xpath='//a' data='<a href="image1.html">Name: My image ...'>, <Selector xpath='//a' data='<a href="image2.html">Name: My ima
ge ...'>, <Selector xpath='//a' data='<a href="image3.html">Name: My image ...'>, <Selector xpath='//a' data='<a href="image4.html">Nam
e: My image ...'>, <Selector xpath='//a' data='<a href="image5.html">Name: My image ...'>]


>>> result[0]
<Selector xpath='//a' data='<a href="image1.html">Name: My image ...'>
获取所有节点
>>> result.extract()  # 提取所有a节点元素
['<a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>',
'<a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>', 
'<a href="image3.html">Name: My image 3 <br><img src="image3_thumb.jpg"></a>', 
'<a href="image4.html">Name: Myimage 4 <br><img src="image4_thumb.jpg"></a>', 
'<a href="image5.html">Name: My image 5 <br><img src="image5_thumb.jpg"></a>']
提取节点内文本
>>> 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']
提取第一个元素

用extract_first()方法, 不能用extract()[0], 因为这个有风险。

>>> response.xpath('//a[@href="image1.html"]/text()').extract_first()
'Name: My image 1 '

extract_first()可以指定默认值,当xpath规则提取不到内容时,会使用指定的默认值

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

css选择器

css选择器与Xpath选择器用法基本一致。

获取所有节点
>>> response.css('a')
[<Selector xpath='descendant-or-self::a' data='<a href="image1.html">Name: My image ...'>, <Selector xpath='descendant-or-self::a' data='<a href="image2.html">Name: My image ...'>, <Selector xpath='descendant-or-self::a' data='<a href="image3.html">Name: My image ...'>,<Selector xpath='descendant-or-self::a' data='<a href="image4.html">Name: My image ...'>, <Selector xpath='descendant-or-self::a' data='<a href="image5.html">Name: My image ...'>]
限定节点属性
>>> response.css('a[href="image1.html"]')
[<Selector xpath="descendant-or-self::a[@href = 'image1.html']" data='<a href="image1.html">Name: My image ...'>]
查找节点内的结点

空格 节点名 eg: a[href=“image1.html”] img

>>> response.css('a[href="image1.html"] img').extract()
['<img src="image1_thumb.jpg">']
提取节点内部文本
>>> 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'
嵌套选择
>>> response.xpath('//a').css('img').xpath('@src').extract()
['image1_thumb.jpg', 'image2_thumb.jpg', 'image3_thumb.jpg', 'image4_thumb.jpg', 'image5_thumb.jpg']

正则匹配

re

只提取Name后面的内容

>>> response.xpath('//a/text()').re('Name:\s(.*)')
['My image 1 ', 'My image 2 ', 'My image 3 ', 'My image 4 ', 'My image 5 ']
re_first

选取列表的第一个元素

>>> response.xpath('//a/text()').re_first('Name:\s(.*)')
'My image 1 '

注意:response不能直接调用re和re_first方法,

>>> response.re('Name:\s(.*)')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'HtmlResponse' object has no attribute 're'
全文正则匹配
>>> response.xpath('.').re('Name:\s(.*)<br>')
['My image 1 ', 'My image 2 ', 'My image 3 ', 'My image 4 ', 'My image 5 ']
>>> response.xpath('.').re_first('Name:\s(.*)<br>')
'My image 1 '