LXML
- 教程:
- 用于 XML 处理的lxml.etree 教程
- John Shipman 关于使用 lxml 处理 Python XML的教程
- Fredrik Lundh 的ElementTree 教程
- 元素树:
- 元素树 API
- lxml.etree的兼容性和区别
- ElementTree 性能特点及比较
- lxml.etree:
- lxml.etree 特定的 API文档
- 生成的API 文档作为参考
- 解析和验证XML
- XPath 和 XSLT支持
- XPath 和 XSLT 的Python XPath 扩展函数
- 自定义 XML API 的自定义 XML 元素类(参见EuroPython 2008 演讲)
- 与其他 XML 工具交互的符合 SAX 的 API
- 用于与外部 C/Cython 模块交互的C 级 API
- lxml.objectify:
- lxml.objectify API 文档
- objectify 和 etree的简单比较
xpath
etree中的xpath解析模块
常用xpath表达式
属性定位
#找到class属性值为song的div标签
//div[@class="song"]
层级&索引定位
#找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
//div[@class="tang"]/ul/li[2]/a
逻辑运算
#找到href属性值为空且class属性值为du的a标签
//a[@href="" and @class="du"]
模糊匹配
//div[contains(@class, "ng")]
//div[starts-with(@class, "ta")]
取文本
# /表示获取某个标签下的文本内容
# //表示获取某个标签下的文本内容和所有子标签下的文本内容
//div[@class="song"]/p[1]/text()
//div[@class="tang"]//text()
取属性
//div[@class="tang"]//li[2]/a/@href
etree对象实例化
本地文件
tree = etree.parse(文件名)
网络数据
tree = etree.HTML(网页内容字符串)
技术文章参考
董小贱 - Xpath高级使用方法
匹配当前节点下的所有:
.//
. 表示当前
// 表示当前标签下的所有标签
注: 要配合使用
匹配某标签的属性值:
/@属性名称
这里以input里的value值为例:
例:xpath(//input/@value)
匹配多个路径:
|
在一个xpath中写的多个表达式用 | 分开, 每个表达式互不干扰。
例:xpath("//tr[6]/td[2]/text() | //tr[7]/td[2]/text()")
按属性匹配:
@
获取所有id="test"的所有文本内容
xpath('//*[@id="test"]//text()')
匹配不包含某个属性的标签
not
多用于表格中匹配中不包含表头信息的数据
例:xpath('//table/tr[not(@class="tbhead")]')
匹配包含多个属性的标签:
and
匹配所有的tr中不包含 tbhead 属性 和包含 head 的tr标签
xpath('//table/tr[not(@class="tbhead") and @class="head"]')
匹配包含不同属性的名称相同的标签:
or
匹配包含class="speedbar" 或者 class="content-wrap" 的标签
例:xpath('//div[@class="speedbar" or @class="content-wrap"]')
将对象还原为字符串:
```xml 将匹配到的对象,作为etree.tostring()的参数即可, 注: 返回字符串etree.tostring()
sObj = xml.xpath(‘//*[@id=”test”]’)[0] #使用xpath定位一个节点 sStr = etree.tostring(sObj)
<a name="MgKkP"></a>
### 按轴(Axes)匹配
<a name="Emzby"></a>
#### 选取当前节点的所有子元素:`child`
```xml
获取div下的tr的标签
例:xpath('//div[@id="testid"]/child::tr/td/text()') # 感觉这种方法鸡肋, //div[@id="testid"]//tr/td 也可以实现
选取当前节点的所有属性:attribute
获取div标签所有的属性值
例: xpath('//div/attribute::') # 感觉这种方法鸡肋,//div/@ 同样能实现
ancestor
:父辈元素 / ancestor-or-self
:父辈元素及当前元素
获取父辈元素的div的所有属性值, 在不好定位的情况下,通过孩子标签定位,这种方法可以用
xpath('//div[@id="test"]/ancestor::div/@*')
xpath('//div[@id="test"]/ancestor-or-self::div/@*')
descendant
:后代 / descendant-or-self
:后代及当前节点本身
获取孩子元素的div的所有属性值,感觉鸡肋
xpath('//div[@id="test"]/descendant::div/@*')
xpath('//div[@id="test"]/descendant-or-self::div/@*')
选取当前节点的所有命名空间节点:namespace
xpath('//div[@id="test"]/namespace::*')
定位:position
和通过下标定位一样, 方法鸡肋
xpath('//*[@id="test"]/ol/li[position()=2]/text()')
Xpath 函数
统计数量:count
统计符合要求节点的数量, 注: 返回字符串
xpath('count(//tr[@info])')
字符串拼接 :concat
统计出来的两个内容的字符串进行“ + ”处理, 注: 返回字符串
xpath('concat(//li[@id="one"]/text(),//li[@id="three"]/text())')
解析当前节点下的字符:string
string()直解析匹配的第一个标签的值, 注: 返回字符串
xpath('string(//tr)')
获取当前节点的节点名称:local-name
返回当前属性的节点名称, 注: 返回字符串
xpath('local-name(//*[@id="test"])')
以指定的字符开头:starts-with
starts-with定位属性值以8开头的li元素
xpath('//tr[starts-with(@code,"one")]/text()')
小于:<
匹配所有tr标签属性info小于200的内容
xpath('//tr[@info<200]/text()')
根据指定的文本内容选择
指定的文本内容可以是文本内容的部分, 也可以是全部
//div[2]/ul/li[contains(text(), "指定的文本内容")]/span/text()
注: 以上内容, 除标注外, 均返回列表!!