我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

scrapy获取到response对象后,需要对response对象进行解析,才能取到后续数据。本文中,苏南大叔将对scrapy解析数据的几种方式,进行总结说明。这其中包括官方推荐的.css.xpath方式,当然还包括有广大web程序员早已熟悉的类似jquery的处理方式。无论你熟悉那种写法,本文中总有一款适合你。

苏南大叔:scrapy爬虫系列:页面数据查询的三种方式 - scrapy-web-data
scrapy爬虫系列:页面数据查询的三种方式(图3-1)

response.css方式

通过.css方式获取对象,相信大家都不陌生。但其中涉及的伪类的概念,可就不是那么常见了。

response.css('title')
response.css('title::text').extract()
response.css('title').extract()
response.css('title::text').extract_first()
response.css('title::text')[0].extract()

这里的title就指的是页面里面的<title></title>,也就是标签名了。设计到的伪类::text就指的是闭合HTML标签里面文字内容了。

pagination = response.css(".pagination")[0]
next_page = pagination.css("li.prev-page a::attr('href')").extract_first()

[0].extract()extract_first()基本上是等同的。而相关dom元素有且只有一个的时候,这个语句就又相当于extract()

response.xpath方式

xpath的方式不如css的方式更加直观好书写。一般来说,一旦你选择xpath方式,苏南大叔推荐你选择chrome的开发者模式,你可以在元素上右键复制xpath路径。这样的话,就比较好理解这些xpath表达式了。

苏南大叔:scrapy爬虫系列:页面数据查询的三种方式 - xpath-copy
scrapy爬虫系列:页面数据查询的三种方式(图3-2)

response.xpath('//title')
response.xpath('//title/text()').extract_first()
response.xpath('//title/text()')[0].extract()
response.xpath('//td[@class="mc_content"]')
response.xpath('//a[@name="_l_p_n"]/@href'))
  • xpath/text()就相当于css::text
  • xpath/@href就相当于css::attr('href')

当然xpath里面还有很多高级的使用方式,本文仅仅做个抛砖引玉。更高级的用法,将在以后的文字中进行详细说明。

类似jquery方式

response.css方式和jquery方式,虽然在选择元素上基本一致,但是后续的操作却完全不同了。那么如果您熟悉jquery的相关函数的话,那么就可以选择这种方法pyquery,支持类似jquery的所有元素操作函数,不过这个包并不是原生支持的,需要额外安装pip包。

pip install pyquery
from pyquery import PyQuery as pq

苏南大叔:scrapy爬虫系列:页面数据查询的三种方式 - pip_install_pyquery
scrapy爬虫系列:页面数据查询的三种方式(图3-3)

下面的是个使用范例,熟悉jq语法的你,从第二条语句时,就可以快速上手了。当然,其实这个pyquery的语法和phpquery语法基本上相似度99.9%,与jquery的语法相似度就略低于99.9%。

content = response.css("article.article-content").extract()[0]
doc = pq(content)
doc(".article-social").remove()
doc("img").removeAttr("class").removeAttr("srcset").removeAttr("sizes")
for img in doc("img"):
    src = pq(img).attr("src")
    pq(img).attr("src",src+"123")

对比实验

目标数据是页面的description,分别使用xpath/css/pyquery三种方式获得对应数据。

<meta name="description" content="苏南大叔的博客" />

如何使用.css/.xpath/以及类似jquery的写法,获得description数据呢?请查看下面的参考答案。

newsn.net:这里是【评论】可见内容
说明一下,strip()就是大家常见的trim()函数在python里面的实现。

总结

scrapy获取到你想要的页面数据后,就可以持久化到数据库中了。那么scrapy如何操作数据库呢?请查看苏南大叔的后续文章。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    scrapy