Post

【Scrapy】选择器

解析页面时最常见的任务是使用选择器从HTML中提取数据,Scrapy使用CSS选择器XPath两种方式从HTML中提取数据

官方文档:https://docs.scrapy.org/en/latest/topics/selectors.html

使用选择器提取数据的相关方法

Response

方法返回值
css(query)SelectorList对象
xpath(query)SelectorList对象

SelectorList类:Selector的列表

属性/方法返回值
css(query)SelectorList对象
xpath(query)SelectorList对象
re(regex)字符串列表
re_first(regex)字符串
getall()字符串列表,包含每个元素的get()方法的返回值
get(default=None)字符串,第一个元素的get()方法的返回值,如果列表为空则返回default
attrib字典,第一个元素的attrib属性,如果列表为空则返回空字典

Selector类:HTML/XML节点的包装类,可以提取数据或者做进一步查询

属性/方法返回值
css(query)SelectorList对象
xpath(query)SelectorList对象
re(regex)字符串列表
re_first(regex)字符串
get()字符串,包含该选择器匹配的内容
attrib字典,包含该选择器匹配节点的属性

CSS选择器常用语法

选择器例子描述
elementp选择所有<p>元素
#iddiv#firstname选择id=”firstname”的<div>元素
.classp.intro选择所有class包含”intro”的<p>元素
element1,element2div,p选择所有<div>元素和所有<p>元素
element1 element2div p选择<div>元素内部的所有<p>元素
element1>element2div>p选择父元素为<div>元素的所有<p>元素
[attribute]div[target]选择带有target属性的所有<div>元素
[attribute=value]a[href=/page/2]选择href=”/page/2”的所有<a>元素
:first-childp:first-child选择属于父元素的第一个子元素的每个<p>元素
:last-childp:last-child选择属于父元素最后一个子元素的每个<p>元素
:nth-child(n)p:nth-child(2)选择属于父元素的第2个子元素的每个<p>元素
::textp::text(Scrapy特有)选择所有<p>元素内部的文本
::attr(attribute)a::attr(href)(Scrapy特有)选择所有<a>元素的href属性值

使用浏览器的检查元素功能可以方便地得到所需的CSS选择器,例如:

检查元素

要想获得所有quote文本所在的<span>元素,只需div.quote > span.text即可

XPath常用语法

在XPath中,HTML/XML文档是被当作节点树来对待的

在XPath中有7中类型的节点:文档(根)节点、元素、属性、文本、命名空间、处理指令、注释

基本语法

语法解释
/node选择根节点
//node选择所有匹配节点,不考虑在文档中的位置
@attr选择属性
[pred]谓语
.选择当前节点
..选择当前节点的父节点

示例

表达式描述
/html选择根节点<html>
//p选择所有<p>元素,不考虑在文档中的位置
//@href选择所有href属性的值
//div[@id="firstname"]选择id=”firstname”的<div>元素
//p[@class="intro"]选择所有class=”intro”的<p>元素
//div/p选择所有<div>元素的所有直接子元素<p>
//div//p选择所有<div>元素内部的所有<p>元素
//div/p | //div/span选择所有<div>元素的所有直接子元素<p><span>
//div[@target]选择带有target属性的所有<div>元素
//a[@href="/page/2"]选择href=”/page/2”的所有<a>元素
//div[@id="main"]/p[1]选择id=”main”的<div>元素的第一个<p>子元素
//div[@id="main"]/p[last()]选择id=”main”的<div>元素的最后一个<p>子元素
//div[@id="main"]/p[position()< 3]选择id=”main”的<div>元素的前两个<p>子元素
//p/text()选择所有<p>元素内部的文本
//a/@href选择所有<a>元素的href属性值
This post is licensed under CC BY 4.0 by the author.