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
                    
                
                
            
        
浙公网安备 33010602011771号