使用Selector提取数据

Selector对象

作用

用于提取页面中的数据

Scrapy选择器是基于lxml库构建的,这意味着它们的速度和解析精度非常相似

构建

  • 从响应构建
1
2
3
>>>response = HtmlResponse(url='http://example.com', body=body)
>>>response.selector.xpath('//span/text()').extract()
[u'good']
  • 从文本构建
1
2
3
>>> body = '<html><body><span>good</span></body></html>'
>>> Selector(text=body).xpath('//span/text()').extract()
[u'good']

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 要实际提取文本数据,必须调用选择器的extract()方法
# 如果你只想提取第一个匹配的元素,可以调用选择器的extract_first()方法
# 提取img元素的src属性的数据
# 如果没有找到会返回'not-found',默认为None
>>> response.css('img').xpath('@src').extract(default='not-found')
# CSS选择器可以使用CSS3伪元素选择文本或属性节点
# 提取title元素的text属性的数据
>>> response.css('title::text').extract()

# 代码效果相同
>>> response.xpath('//base/@href').extract()

>>> response.css('base::attr(href)').extract()

# 代码效果相同
>>> response.xpath('//a[contains(@href, "image")]/@href').extract()

>>> response.css('a[href*=image]::attr(href)').extract()

# 代码效果相同
>>> response.xpath('//a[contains(@href, "image")]/img/@src').extract()

>>> response.css('a[href*=image] img::attr(src)').extract()

XPath使用

表达式

  • /

    根节点(root)

  • .

    当前节点

  • ..

    当前节点的父节点

  • element

    选中子节点的所有元素节点

  • //element

    选中后代节点中所有的元素节点

  • *

    选中所有节点的子节点

  • text()

    选中节点的文本值

  • @attr

    选中名为attr的属性节点

  • @*

    选中所有属性节点

  • [谓语]

    使用谓语来查找某个特定的节点或者包含某个特定的值的节点

常用函数

  • string(arg)

    返回参数的字符串值

  • contains(str1,str2)

    判断str1中是否包含str2,返回布尔值

CSS选择器

  • *

    所有元素

  • element

    选中的元素

  • e1,e2

    选中e1e2元素

  • e1 e2

    选中e1后代元素中的e2元素

  • e1>e2

    选中e1子元素中的e2元素

  • e1+e2

    选中e1兄弟元素中的e2元素

  • .CLASS

    选中CLASS属性包含CLASS的元素

  • #ID

    选中id属性为ID的元素

  • [attr]

    选中包含attr属性的元素

  • [attr=vaule]

    选中包含attr属性且值为vaule的元素

  • [attr~=vaule]

    选中包含attr属性且值包含vaule的元素

  • E:empty

    选中没有子元素的的E元素

  • E::text

    选中E元素的文本节点

赏个🍗吧
0%