XPath
什么是XPath?
xpath(XML Paht Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历。
XPath开发工具
Chrome插件XPath Helper。 Fiefox插件Try XPath
XPath节点
在XPath中,有7类节点:元素,属性,文本,命名空间,处理指令,注释以及文档(根)节点。XML文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
XPath语法
表达式 描述 / 从根节点选取。或者是元素和元素间的过度 // 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置 . 选取当前节点 . . 选取当前节点的父节点 @ 选取属性 text() 选取文本
表达式 结果 bookstore 选择bookstore元素 /bookstore 选取根元素bookstore。注释:假如路径起始于正斜杠(/),则此路径始终代表到某元素的绝对路径 bookstore/book 选取所有book子元素,而不管它们位于bookstore之下的什么位置 //book/title/@lang 选择所有的book下面的title中的lang属性的值 //book/title/text() 选择所有的book下面的title文本 /bookstore/* 选取bookstore元素的所有子元素 //* 选取文档中所有的元素 //title[@*] 选取所有带属性的title元素
通配符 描述 * 匹配任何元素节点 @* 匹配任何属性节点 node() 匹配任何类型的节点
案例
html_str = """
<div>
<ul>
<li class="item-1">
<a href="link1.html">第一个</a>
</li>
<li class="item-2">
<a href="link2.html">第二个</a>
</li>
<li class="item-3">
<a href="link3.html">第三个</a>
</li>
<li class="item-4">
<a href="link4.html">第四个</a>
</li>
<li class="item-5">
<a href="link5.html">第五个</a>
</li>
</ul>
</div>
"""
import parsel
data = parsel. Selector( html_str)
res = data. xpath( '/html/body/div/ul/li/a' ) . getall( )
res = data. xpath( '//a' ) . getall( )
res = data. xpath( '//ul' )
res2 = res. xpath( './li' ) . getall( )
res3 = res. xpath( './li/a' ) . getall( )
res = data. xpath( '//a' )
res4 = data. xpath( '../@class' ) . getall( )
res = data. xpath( '//li[3]' ) . getall( )
res = data. xpath( '//a[@href="link4.html"]' ) . getall( )
res = data. xpath( '//a[@href="link4.html"]/text()' ) . getall( )
res = data. xpath( '//li[5]/a/@href' ) . getall( )
res = data. xpath( '//li[contains(@class,"it")]' ) . getall( )
res = data. xpath( '//li/@class|//a/text()' ) . getall( )
通过路径表达式中使用 | 运算符,可以选取若干个路径。
总结
xpath 的节点关系:根节点,子节点,同级节点 xpath 的重点语法获取任意节点:// xpath 的重点语法根据属性获取节点:标签[@属性=‘值’] xpath 中获取节点的文本:text() xpath 的获取节点属性值:@属性名
CSS选择器
选择器 例子 例子描述 .class .intro 选择 class=“intro” 的所有元素 #id #name 选择 id=“name” 的所有元素 * * 选择所有元素 element p 选择所有p元素 element,element div,p 选择所有div元素和p元素 element element div p 选择div内部的所有p元素 element>element div>p 选择父元素为div的所有p元素 [attribute] [target] 选择带有 target属性的所有元素 [attribute=value] [target=_blank] 选择target=“_blank” 的所有元素 :last-of-type p:last-of-type 选择每个p元素是其父元素的最后一个p元素 :nth-child(n) p:nth-child(2) 选择所有p元素的父元素的第二个子元素 :not(n) :not( p) 选择所有p以外的元素 :nth-last-child(n) p:nth-last-child(2) 选择所有p元素倒数的第二个子元素
案例
标签选择器
html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>标签选择器</title>
</head>
<style>
p{
color: #f00;
font-size: 16px;
}
</style>
<body>
<p>css标签选择器的介绍</p>
<p>标签选择器、类选择器、ID选择器</p>
<a href="https://www.baidu.com">百度一下</a>
<span> 我是一个span标签</span>
</body>
</html>
"""
import parsel
selector = parsel. Selector( html)
span = selector. css( 'span' ) . get( )
a = selector. css( 'a' ) . getall( )
print ( span)
print ( a)
类选择器
p = selector. css( '.top' ) . getall( )
print ( p)
ID选择器
p = selector. css( '#contend' ) . getall( )
print ( p)
属性选择器
p = selector. css( 'p::text' ) . getall( )
print ( p)
a = selector. css( 'a::attr(href)' ) . getall( )
print ( a)
伪类选择器
p = selector. css( 'p:nth-child(2)::attr(class)' ) . getall( )
print ( p)
组合选择器