小言_互联网的博客

scrapy爬虫编写-常用xpath选择器和css选择器

389人阅读  评论(0)

编写scrapy爬虫,处理items相关元素数据,涉及到selector, 整理备查。

目录

一、常用xpath使用方法

二、css语法

三、xpath选择器整理

四、css选择器整理

 

一、常用xpath使用方法:


xpath常用语法

/:根节点

//xxx/zzz:路径

//div:去全局的子孙中找所有的div元素

.//表示去当前对象的子孙中找

/xxx//div:去儿子对象中找xxx节点下所有的div元素

*:匹配任意节点元素

/html/body/div[1]:选取body下的第一个div节点

//div[@class="xxx"]:选取class属性为xxx的div节点

//@attr:获取attr对应的值

常用函数

text():提取文本信息,//*[@class='xxx']/text()

position():选取第几个节点,//*[position()=1]

last():选取最后一个节点,//*[last()]

starts-with(@attr,substr):attr属性值开头substr的节点

contains(@attr,substr):attr属性值是否包含substr

运算符

|:计算两个节点集合,比如//div|//li

比较运算符=,!=,<=...,比如//price[text()>10]

算数运算符:+,-,*,div,比如//price[text()+1]

逻辑运算符:or,and,[@class='xxxx' or @class='yyyy']


xpath语法案例:以取a标签为案例,div、span等都相同

xpath('//a'):找到全局中所有的a标签

xpath('//a/text()  '):获取a标签的文本值

xpath('//a/span'):a标签对象儿子下的span标签

xpath('//a[2]'):a标签找到后,返回的是一个列表,[n]列表的n位置的值

xpath('//a[@id]'):找全局中属性为id的a标签

xpath('//a[@id="i1"]'):找全局中属性id为i1的a标签

xpath('//a/@id'):取a标签的id的属性值

xpath('//a[@href="link.html"][@id="i1"]'):两个[]代表双条件,需要href="link.html“,且id="i1"的a标签

xpath('//a[contains(@href, "link")]'):a标签的href需要包含"link"字符

xpath('//a[starts-with(@href, "link")]'):a标签的href需要以"link"开头

xpath('//a[re:test(@id, "i\d+")]'):正则表达式的写法,需要有re:test

xpath('//a[re:test(@id, "i\d+")]/@href').extract(),正则表达式的写法案例

xpath(.//)在当前基础上往下找,需要加“.”,比如用在for循环中

obj.extract()#列表中的每一个对象转化字符串==>返回一个列表

obj.extract_first() #列表中的每一个对象转化字符==>列表中的第一个元素

xpath('/html/body/ul/li/a/@href').extract():一层层去找标签
 

二、css语法

基本语法

.classvalue:选择class属性为classvalue的元素

#idvalue:选择id值为idvalue的元素

p:选择所有的p元素

div,p:选择所有的div和p元素

div~p:前面有div元素的每个p元素,div和p为兄弟节点

li span :选择li内部所有的span元素

div>p:选择父结点为div的所有p元素

::text/::attr(src):文本信息/提取某个属性的值,比如a::attr(href),提取超链接


属性的语法

[attr]选择所有带attr属性的元素

[attr=val]选择attr值为val的所有元素:[numvalue=num1]

[attr^=val]选择attr属性值以val开头的元素:[src^=http]

[attr$=val]选择attr属性值以val结尾的元素:[src^=.jpg]

[attr*=val]选择attr属性值包含val的元素:[src*=douban]


ele语法

ele:first-of-type:所有子元素为ele的第一个元素

ele:first-child:第一个元素为ele的元素

ele:only-of-type:类型为ele的元素

ele:only-child:唯一子元素的每个ele元素

ele:nth-of-type(n):选择第n个ele元素

ele:nth-child(n):第n个子元素为ele的元素

ele:last-child:最后一个为ele的子元素
 

三、xpath选择器整理

表达式 说明
article 选取所有article元素的所有子节点
/article 选取根元素article
article/a 选取所有属于article的子元素的a元素
//div 选取所有div子元素(不论出现在文档任何地方)
article//div 选取所有属于article元素的后代的div元素,不管它出现在article之下的任何位置
//@class 选取所有名为class的属性
/article/div[1] 选取属于article子元素的第一个div元素
/article/div[last()] 选取属于article子元素的最后一个div元素
/article/div[last()-1] 选取属于article子元素的倒数第二个div元素
//div[@lang] 选取所有拥有lang属性的div元素
//div[@lang='eng'] 选取所有lang属性为eng的div元素
/div/* 选取属于div元素的所有子节点
//* 选取所有元素
//div[@*] 选取所有带(任意)属性的div元素
/div/a | //div/p 选取所有div元素的a和p元素
//span | //ul 选取文档中的span和ul元素
article/div/p | //span 选取所有属于article元素的div元素的p元素以及文档中的所有span元素
//div[@id='1']/h1/text() 获取id为1的div标签下的h1标签里的内容
//span[not(@class)] 选择不包含class属性的span节点
//span[not(@class) and not(@id)] 选择不包含class和id属性的span节点
//span[not(contains(@class,'expire'))] 选择不包含class="expire"的span
//span[contains(@class,'expire')] 选择包含class="expire"的span
//h2[contains(text(),'Activated')] 选择标签内容里包含Activated的h2标签
//div[not(contains(text(),'activated'))] 选择标签内容中不包含activated的div标签

XPATH如何选择不包含某一个属性的节点

我们知道选择包含某一特定属性的节点,可以使用例如//tbody/tr[@class]来选择。那么不含某属性的节点如何用xpath取得呢?

这里可以用到not。例如排除一个属性的节点可以使用//tbody/tr[not(@class)]来写,排除一个或者两个属性可以使用//tbody/tr[not(@class or @id)]来选择。

 

四、css 选择器整理

表达式 说明
* 选择所有节点
# container 选择id为container的节点
.container 选取所有class 包含container的节点
li a 选取所有li下的所有a节点 (子节点)
ul + p 选择ul后面的第一个p元素(兄弟节点)
div#container > ul 选取id为container的div的第一个ul子元素
ul ~ p 选取与ul相邻的所有p元素
a[title] 选取所有有title属性的a元素
a[href="a.com"] 选取所有href属性为a.com值的a元素
a[href*="a"] 选取所有href属性包含a的a元素
a[href^="http"] 选取所有href属性值以http开头的a元素
a[href$=".jpg"] 选取所有href属性值以.jpg结尾的a元素
inupt[type=radio]:checked 选取状态为选中的radio元素
div:not(#container) 选取所有id不为container的div元素
li:nth-child(3) 选取第三个li元素
tr:nth-child(2n) 第偶数个tr元素

 


转载:https://blog.csdn.net/ebzxw/article/details/102171586
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场