和Selector类似,为了方便用户编码操作,XPath
在Response
中也集成了。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-self | xpath(‘./ancestor-or-self::*’) | 选取当前节点的所有先辈节点以及节点本身 |
attribute | xpath(‘./attribute::*’) | 选取当前节点的所有属性 |
child | xpath(‘./child::*’) | 返回当前节点的所有子节点 |
descendant | xpath(‘./descendant::*’) | 返回当前节点的所有后代节点(子节点、孙节点) |
following | xpath(‘./following::*’) | 选取文档中当前节点结束标签后的所有节点 |
following-sibing | xpath(‘./following-sibing::*’) | 选取当前节点之后的兄弟节点 |
parent | xpath(‘./parent::*’) | 选取当前节点的父节点 |
preceding | xpath(‘./preceding::*’) | 选取文档中当前节点开始标签前的所有节点 |
preceding-sibling | xpath(‘./preceding-sibling::*’) | 选取当前节点之前的兄弟节点 |
self | xpath(‘./self::*’) | 选取当前节点 |
函数 | 用法 | 解释 |
starts-with | xpath(‘//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/