scrapy-6 | Response内置XPath选择器

和Selector类似,为了方便用户编码操作,XPathResponse中也集成了。
Xpath(XML Path Language)XML路径语言,是一种用来确定xml文档中某元素位置的语言。
提示: HTML属于xml
第四讲案例中我们已经按照实际举过例子,下面我们看看具体的语法:

语法

表达式描述
/选中文档的根(root)
.选中当前节点
..选中当前节点的父节点
Element选中子节点中所有Element元素节点
//Element选中后代节点中所有的Element元素节点
*选中所有元素子节点
text()选中所有文本子节点
@Attr选中名为Attr的属性节点
@*选中所有属性节点
[谓语]查找特定的节点或者包含特定值的节点

下面举一些案例:

案例

from scrapy.http import HtmlResponse

text = """
<ul>
    <li class="one">Python</li>
    <li class="two">Java</li>
    <li id = "three">JavaScript</li>
</ul>
"""
response = HtmlResponse(url="baidu.com", body=text, encoding="utf8")
res = response.xpath("//li").extract() 
# 找到所有的li,为了便于观察打印的结果,这里均抽取内容

res = response.xpath("//li/text()").extract() # 找到所有的li中的文本内容
res = response.xpath("/*").extract()  # 根下的所有节点
res = response.xpath("//@class").extract()  #['one', 'two']
res = response.xpath("//@*").extract()  #['one', 'two', 'three']

##[谓语]
# 操作元素属性
res = response.xpath("//li[@class='one']").extract() 
# ['<li class="one">Python</li>']

# 列表集下标(从1开始)
res = response.xpath("//li[1]").extract()  
#['<li class="one">Python</li>']

# last() 选中最后一个
res = response.xpath("//li[last()]").extract()  
#['<li id="three">JavaScript</li>']

# position()函数
res = response.xpath("//li[position()<=2]").extract()  # 选中前两个元素 
#['<li class="one">Python</li>', '<li class="two">Java</li>']

除此之外,xpath还提供了很多常用函数:

其他

① 取多个路径
使用“|”运算符可以选取多个路径

xpath(//div|//table’)  #选取所有的div和table节点

② 轴 (定义相对于当前节点的节点集)

轴名称表达式描述
ancestor
xpath(‘./ancestor::*’)选取当前节点的所有先辈节点(父、祖父)
ancestor-or-selfxpath(‘./ancestor-or-self::*’)选取当前节点的所有先辈节点以及节点本身
attributexpath(‘./attribute::*’)选取当前节点的所有属性
childxpath(‘./child::*’)返回当前节点的所有子节点
descendantxpath(‘./descendant::*’)返回当前节点的所有后代节点(子节点、孙节点)
followingxpath(‘./following::*’)选取文档中当前节点结束标签后的所有节点
following-sibingxpath(‘./following-sibing::*’)选取当前节点之后的兄弟节点
parentxpath(‘./parent::*’)选取当前节点的父节点
precedingxpath(‘./preceding::*’)选取文档中当前节点开始标签前的所有节点
preceding-siblingxpath(‘./preceding-sibling::*’)选取当前节点之前的兄弟节点
selfxpath(‘./self::*’)选取当前节点
③功能函数
函数用法解释
starts-withxpath(‘//div[starts-with(@id,”ma”)]‘)选取id值以ma开头的div节点
contains
xpath(‘//div[contains(@id,”ma”)]‘)选取id值包含ma的div节点
and
xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘)选取id值包含ma和in的div节点
text()xpath(‘//div[contains(text(),”ma”)]‘)选取节点文本包含ma的div节点
---

当然,在实际操作用,有更加人性化的操作去获取元素的xpath书写
在浏览器中,审查元素,在代码中找到元素节点,然后Copy->Copy Xpath,如下面的就是我复制的:

//*[@id=”asideCategory”]/h3

xpath文档:https://www.w3.org/TR/xpath/all/


   Reprint policy


《scrapy-6 | Response内置XPath选择器》 by 梦否 is licensed under a Creative Commons Attribution 4.0 International License
 Previous
scrapy-7 |  Response内置CSS选择器 scrapy-7 | Response内置CSS选择器
和xpath类似,CSS在Response中也集成了。CSS选择器的语法更加简单,但是功能不如xpath强大。 CSS即层叠样式表。 语法 表达式描述例子*选中所有元素css('*')Element选中Element元素css('img')
2019-06-09
Next 
scrapy-5 |  Response内置Selector scrapy-5 | Response内置Selector
前面大致介绍了Selector,但是在实际开发中,我们基本上都是不需要手动创建Selector对象的。 Response对象的selector属性被第一次访问时,Response对象内部就会自动创建一个Selector对象,并且将该Sele
2019-06-06
  TOC