博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
提取网页数据
阅读量:7046 次
发布时间:2019-06-28

本文共 3431 字,大约阅读时间需要 11 分钟。

 

 

wljdeMacBook-Pro:~ wlj$ scrapy shell http://doc.scrapy.org/en/latest/_static/selectors-sample1.html

>>> response.url
'https://doc.scrapy.org/en/latest/_static/selectors-sample1.html'
>>> response.text
页面远吗如下:

<html>

<head></head>
<body>
<base href="http://example.com/" />
<title>Example website</title>
<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选择器

>>> result = response.selector.xpath('.//a')

>>> 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[0]

<Selector xpath='.//a' data='<a href="image1.html">Name: My image 1 <'>

 

>>> response.xpath('//a[@href="image1.html"]/text()').extract()

['Name: My image 1 ']

很多情况下,我们想要匹配第一个元素内容,通过加一个索引来获取。

>>> response.xpath('//a[@href="image1.html"]/text()').extract()[0]
'Name: My image 1 '
>>>
这个写法明显是有风险的,一旦XPath有问题,那么extract()后的结果可能是一个空列表。如果再用索引来取,就导致数组越界。
另外一个方法可以专门提取单个元素,它叫作extract_first()。

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

'Name: My image 1 '

也可以为extract_first()方法设置一个默认值参数

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

如果XPath匹配不到任何元素,extract_first('Defalt Image')传递了一个参数Defalt Image当默认值,返回值会使用这个参数,输出正是如此。

如果XPath匹配不到任何元素,xtract_first()会返回空,不会报错。extract()[0]则会报错。

CSS选择器

>>> response.css('a[href="image1.html"] img').extract_first()

'<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'

CSS选择器和XPath选择器一样可以嵌套使用

>>> response.xpath('//a').css('img').xpath('@src').extract()

['image1_thumb.jpg', 'image2_thumb.jpg', 'image3_thumb.jpg', 'image4_thumb.jpg', 'image5_thumb.jpg']

>>> response.xpath('//a').css('img').xpath('@src').extract_first()

'image1_thumb.jpg'

正交匹配

>>> response.xpath('//a/text()').re('Name:\s(.*)')

['My image 1 ', 'My image 2 ', 'My image 3 ', 'My image 4 ', 'My image 5 ']

>>> response.xpath('//a/text()').re('(.*?):\s(.*)')

['Name', 'My image 1 ', 'Name', 'My image 2 ', 'Name', 'My image 3 ', 'Name', 'My image 4 ', 'Name', 'My image 5 ']

>>> response.xpath('//a/text()').re('(.*?):\s(.*)')

['Name', 'My image 1 ', 'Name', 'My image 2 ', 'Name', 'My image 3 ', 'Name', 'My image 4 ', 'Name', 'My image 5 ']

>>> response.xpath('//a/text()').re_first('(.*?):\s(.*)')

'Name'

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

'My image 1 '

值得注意的是,response对象不能直接调用re()和re_first()方法。如果想对全文进行正则匹配,可以先调用xpath()方法再正则匹配。

>>> response.xpath('.').re_first('Name:\s(.*)<br>')
'My image 1 '

 

转载于:https://www.cnblogs.com/wanglinjie/p/9255922.html

你可能感兴趣的文章
网络流入门
查看>>
mysql中按in中的数据排序
查看>>
Redis 命令参考
查看>>
DIV垂直居中
查看>>
我的友情链接
查看>>
本地通知
查看>>
Java编程经验
查看>>
CVS
查看>>
在Spring中发现java.lang.ClassCastException: $Proxy1问题解
查看>>
android教父高焕堂 成都之行
查看>>
SQL*loader实验
查看>>
awk案例更新
查看>>
可用的 kali 源(2016)
查看>>
《Tomcat日志系统详解》
查看>>
JAVA WEB基础
查看>>
采用EntityFramework.Extended 对EF进行扩展
查看>>
Mysql多源复制
查看>>
【翻译】在Ext JS和Sencha Touch中创建自定义布局
查看>>
Python 远程批量修改密码脚本
查看>>
CMD禁用和手动解除1
查看>>