添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
不敢表白的台灯  ·  世和基因·  2 月前    · 
买醉的闹钟  ·  S常用函数参考·  4 月前    · 
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选择器常用语法

选择器 例子 描述
element p 选择所有 <p> 元素
#id div#firstname 选择id=”firstname”的 <div> 元素
.class p.intro 选择所有class包含”intro”的 <p> 元素
element1,element2 div,p 选择所有 <div> 元素和所有 <p> 元素
element1 element2 div p 选择 <div> 元素内部的所有 <p> 元素
element1>element2 div>p 选择父元素为 <div> 元素的所有 <p> 元素
[attribute] div[target] 选择带有target属性的所有 <div> 元素
[attribute=value] a[href=/page/2] 选择href=”/page/2”的所有 <a> 元素
:first-child p:first-child 选择属于父元素的第一个子元素的每个 <p> 元素
:last-child p:last-child 选择属于父元素最后一个子元素的每个 <p> 元素
:nth-child(n) p:nth-child(2) 选择属于父元素的第2个子元素的每个 <p> 元素
::text p::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.