网页源代码解析
xpath 解析
- //元素标签名
例如: //div,查找网页内的所有div
- //元素标签名[@属性名=‘具体内容’]
例如: //div[@class=‘div1’],查找class为div1的div
- //元素标签名[第几个]
例如: //div[@class=‘box’][2],查找符合条件的第2个div
- //元素1/元素2/元素3…
例如: //ul/li/div/a/img,查找ul下的li下的div下的a下的img标签
- //元素1/@属性名
例如://ul/li/div/a/img/@src, 查找ul下的li下的div下的a下的img标签的src属性
- //元素/text()
例如://a/text(), 获取a标签之间的文本(一级文本)
- //元素//text()
例如://div[@class=‘box’]//text(), 获取class为div下的所有文本
- //元素[contains(@属性名,‘相关属性值’)]
例如://div[contains(@class,‘zhangsan’)] 查找class中包含zhangsan的div
- //*[@属性=‘值’]
* 可表示任意标签名
属性可以是任意
例如://*[@name=‘lisi’]查找所有name为lisi的元素
- 逻辑运算定位。and 或 or
通过and来缩小过滤的范围,只有条件都符合时才能定位到
//div[@name=‘city’ and @size=‘4’ and @multiple=“multiple”]
or就相反了,只要这些筛选中,条件满足一个就能匹配到了
//div[@name=‘city’ or @size=‘4’ or @multiple=“multiple”]
- starts-with / ends-with
解析:匹配以 ctrl开始的属性值
input[starts-with(@id,‘ctrl’)]
解析:匹配以 userName 结尾的属性值
input[ends-with(@id,’_userName’)]
- last()
选取属于 div 子元素的最后一个 p 元素
//div/p[last()]
选取属于 div 子元素的倒数第二个 p 元素
//div/p[last()-1]
- position()
选取最前面的两个属于 div 元素的子元素的 p 元素
/div/p[position() < 3]
表达式 | 描述 |
---|---|
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
. . | 选取当前节点的父节点 |
//div[@lang] | 选取所有拥有名为 lang 的属性的 div 元素 |
//div/p[price>35.00] | 选取 div 元素的所有 p 元素,且其中的 price 元素的值须大于 35.00。 |
//a[text()=‘下一页’] | 匹配内容为下一页的a标签 |
/bookstore/* | 选取 bookstore 元素的所有子元素。 |
- 节点轴选择
# -*- coding:utf-8 -*-
from lxml import etree
text = """
<div>
<ul>
<li class="item-0" name="name-0"><a href="link1.html"><span>first item</span></a></li>
<li class="item-1" name="name-1"><a href="link1.html">second item</a></li>
<li class="item-inactive" name="name-2"><a href="link3.html">third item</a></li>
<li class="item-1" name="name-3"><a href="link4.html">fourth item</a></li>
<li class="item-0" name="name-4"><a href="link5.html">fifth item</a></li>
</ul>
</div>
"""
html = etree.HTML(text)
result = html.xpath("//li[1]/ancestor::*")
print("1", result)
result = html.xpath("//li[1]/ancestor::div")
print("2", result)
result = html.xpath("//li[1]/attribute::*")
print("3", result)
result = html.xpath("//li[1]/attribute::class")
print("4", result)
result = html.xpath("//li[1]/child::*")
print("5", result)
result = html.xpath("//li[1]/child::a[@href='link1.html']")
print("6", result)
result = html.xpath("//li[1]/descendant::*")
print("7", result)
result = html.xpath("//li[1]/descendant::span")
print("8", result)
result = html.xpath("//li[1]/following::*")
print("9", result)
result = html.xpath("//li[1]/following::*[2]")
print("10", result)
result = html.xpath("//li[1]/following-sibling::*")
print("11", result)
result = html.xpath("//li[1]/following-sibling::*[2]")
print("12", result)
- ancestor轴,可以获取所有祖先节点,其后需要跟两个冒号,然后是节点选择器,使用* ,表示匹配所有节点;
- attribute轴,可以获取属性值,使用*,代表获取节点的所有属性;
- child轴,可以获取子节点,使用*,代表获取所有子节点;
- descendant轴,获取所有子孙节点;
- following轴,获取当前节点之后的所有节点,若添加索引选择,只获取对应节点;
- following-sibling轴,获取当前节点之后的所有同级节点,若添加索引选择,只获取对应节点。