scrapy提取数据 xpath选择器

scrapy提取数据的方式除了css选择器之外还有xpath提取方式。技多不压身。
xpath表达式函数:response.xpath("表达式")
每个.xpath() 调用返回selector组成的list

windows设置代理:
set http_proxy=http://username:password@openproxy.hw.com:8080

 

//表示文档里的任何位置的节点,从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
/表示文档里根下的那些节点
.    选取当前节点。
..    选取当前节点的父节点。
@    选取属性。

举例

//C所有C元素
//C/E 所有父节点为C的E元素
/A/C/D 节点"A"的子节点"C"的子节点"D"

/html/head/title: 选择HTML文档中 <head> 标签内的 <title> 元素
/html/head/title/text(): 选择上面提到的 <title> 元素的文字
//td: 选择所有的 <td> 元素
//div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素

 

当您在终端运行Scrapy时,如果包含参数的url(例如 & 字符), 则需要给url地址加上引号

C:\> scrapy shell lab.scrapyd.cn
.............
#当shell载入后,您将得到一个包含response数据的本地 response 变量。输入 response.body 将输出response的包体, 输出 response.headers 可以看到response的包头。
>>> response.status
200
>>> response.url
'http://lab.scrapyd.cn'
>>> response.headers
{b'Via': [b'proxy A'], b'Date': [b'Sat, 26 Jan 2019 06:00:50 GMT'], b'Server': [b'nginx'], b'Content-Type': [b'text/html; charset=UTF-8'], b
'X-Powered-By': [b'PHP/7.1.5']}
>>> response.meta
{'handle_httpstatus_list': <scrapy.utils.datatypes.SequenceExclude object at 0x0000000005385DD8>, 'download_timeout': 180.0, 'proxy': 'http:
//openproxy.huawei.com:8080', 'download_slot': 'lab.scrapyd.cn', 'download_latency': 0.20313167572021484, 'depth': 0}
>>> response.body
b'<!DOCTYPE HTML>\n<html class="no-js">\n<head>\n    <meta charset="UTF-8">
......
>>> response.xpath('//title')
[<Selector xpath='//title' data='<title>SCRAPY爬虫实验室 - SCRAPY中文网提供</title>'>]
>>> response.xpath('//title/text()')
[<Selector xpath='//title/text()' data='SCRAPY爬虫实验室 - SCRAPY中文网提供'>]
>>> response.xpath('//title/text()').extract()
['SCRAPY爬虫实验室 - SCRAPY中文网提供']
>>> response.xpath('//title/text()').extract()[0]
'SCRAPY爬虫实验室 - SCRAPY中文网提供'

以此类似的网页为例子

<ol class="page-navigator">
  <li class="current"><a href="http://lab.scrapyd.cn/page/1/">1</a></li>
  <li><a href="http://lab.scrapyd.cn/page/2/">2</a></li>
  <li><a href="http://lab.scrapyd.cn/page/3/">3</a></li>
  <li><a href="http://lab.scrapyd.cn/page/4/">4</a></li>
</ol>

 

D:\work\pycode>scrapy shell lab.scrapyd.cn
......
>>> response.xpath("//@href")
[<Selector xpath='//@href' data='//cdnjscn.b0.upaiyun.com/libs/normalize/'>,
 <Selector xpath='//@href' data='http://lab.scrapyd.cn/usr/themes/default'>,
 ……
 <Selector xpath='//@href' data='http://lab.scrapyd.cn/'>]
>> response.xpath("//ol//@href") #"//ol//@href",这个表达式表示:ol标签下所有的href属性值
[
<Selector xpath='//ol//@href' data='http://lab.scrapyd.cn/page/1/'>, 
......
<Selector xpath='//ol//@href' data='http://lab.scrapyd.cn/page/6/'>, 
<Selector xpath='//ol//@href' data='http://lab.scrapyd.cn/page/2/'>
]

>>> response.xpath("//ol[@class='page-navigator']//@href") #限定属性格式: 标签[@属性名='属性值']
[
<Selector xpath="//ol[@class='page-navigator']//@href" data='http://lab.scrapyd.cn/page/1/'>, 
<Selector xpath="//ol[@class='page-navigator']//@href" data='http://lab.scrapyd.cn/page/2/'>, 
<Selector xpath="//ol[@class='page-navigator']//@href" data='http://lab.scrapyd.cn/page/3/'>, 
......
<Selector xpath="//ol[@class='page-navigator']//@href" data='http://lab.scrapyd.cn/page/2/'>
]
>>> response.xpath("//ol[@class='page-navigator']//@href").extract()
[
'http://lab.scrapyd.cn/page/1/', 
'http://lab.scrapyd.cn/page/2/', 
......
'http://lab.scrapyd.cn/page/2/'
]
>>> response.xpath("//title//text()").extract()
['SCRAPY爬虫实验室 - SCRAPY中文网提供']

 

D:\work\pycode>scrapy shell http://lab.scrapyd.cn/archives/28.html
......
>>> response.xpath("//div[@class='post-content']//text()").extract()
[
'\n            ', 
'如果你因失去了太阳而流泪,那么你也将失去群星了。 ', 
'If you shed tears when you miss the sun, you also miss the stars. ', 
'scrapy中文网(', 'http://www.scrapyd.cn', 
')整理', 
'        '
]
#如何获得整段文字?用到一个xpath函数:string()
#我们可以把表达式这样写:response.xpath("string(//div[@class='post-content'])").extract(),
#可看到我们没有使用:text(),而是用:string(要提取内容的标签),
#这样的话就能把数据都提取出来了,而且都合成为一条,并非一个列表
>>> response.xpath("string(//div[@class='post-content'])").extract()
['\n            如果你因失去了太阳而流泪,那么你也将失去群星了。 If you shed tears when you miss the sun, you also miss the stars. scrapy中文网(http://www.scrapyd.cn)整理        ']

 

<ul class="tags-list">
   <li><a style="color:rgb(163,61,
      224)" href="http://lab.scrapyd.cn/tag/%E4%BA%BA%E7%94%9F/">
    人生</a></li>
   <li><a style="color:rgb(37,116,
      249)" href="http://lab.scrapyd.cn/tag/%E5%8A%B1%E5%BF%97/">
    励志</a></li>
   <li><a style="color:rgb(94,92,
      108)" href="http://lab.scrapyd.cn/tag/%E7%88%B1%E6%83%85/">
    爱情</a></li>
   <li><a style="color:rgb(44,110,
      131)" href="http://lab.scrapyd.cn/tag/%E7%8E%8B%E5%B0%94%E5%BE%B7/">
    王尔德</a></li>
   <li><a style="color:rgb(15,68,
      198)" href="http://lab.scrapyd.cn/tag/%E6%99%BA%E6%85%A7/">
    智慧</a></li>
   <li><a style="color:rgb(77,28,
      200)" href="http://lab.scrapyd.cn/tag/%E6%B3%B0%E6%88%88%E5%B0%94/">
    泰戈尔</a></li>
   <li><a style="color:rgb(87,34,
      152)" href="http://lab.scrapyd.cn/tag/%E7%BB%9D%E4%B8%96%E5%A5%BD%E8%AF%8D/">
    绝世好词</a></li>
   <li><a style="color:rgb(79,189,
      11)" href="http://lab.scrapyd.cn/tag/%E6%9C%A8%E5%BF%83/">
    木心</a></li>
   <li><a style="color:rgb(111,250,
      172)" href="http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/">
    艺术</a></li>
   <li><a style="color:rgb(132,3,
      48)" href="http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/">
    名画</a></li>
   <li><a style="color:rgb(46,2,
      113)" href="http://lab.scrapyd.cn/tag/%E7%94%9F%E6%B4%BB/">
    生活</a></li>
   <li><a style="color:rgb(243,193,
      227)" href="http://lab.scrapyd.cn/tag/%E8%AF%8D/">
    词</a></li>
    <li><a href="http://lab.scrapyd.cn">返回首页</a></li>
   <li><a href="http://bbs.scrapyd.cn" target="_blank">SCRAPY中文社区</a></li>
   <li><a href="http://www.scrapyd.cn" target="_blank">SCRAPY中文网</a></li>
</ul>

 

# scrapy shell http://lab.scrapyd.cn/page/1/
>>> response.xpath("//ul[@class='tags-list']/li/a/text()").extract() ['\r\n 人生', '\r\n 励志', '\r\n 爱情', '\r\n 王尔德', '\r\n 智慧', '\r\n 泰戈尔', '\r\n 绝世好词', '\r\n 木心', '\r\n 艺术', '\r\n 名画', '\r\n 生活', '\r\n 词', '返回首页', 'SCRAPY中文社区', 'SCRAPY中文网' ]

参考网址:http://www.scrapyd.cn/doc/186.html 

posted @ 2019-01-25 15:02  牧 天  阅读(532)  评论(0)    收藏  举报