一、python解析库xpath
为什么要学习XPATH和LXML类库?
lxml是⼀款⾼性能的Python HTML/XML解析器,我们可以利⽤Xpath来快速的定位特定元素以及获取节点信息。
什么是XPATH?
什么是XPATH?
Xpath是⼀⻔在HTML/XML⽂档中查找信息的语⾔,可⽤来在HTML/XML⽂档中对元素和属性进⾏遍历。
⽂档:xpath教程
1、认识XML
数据格式 | 描述 | 设计⽬标 |
---|
XML | 可扩展标记语⾔ | 被设计为传输和存储数据,其焦点是数据的内容 |
HTML | 超⽂本标记语⾔ | 显示数据以及如何更好显示 |
2、XML的节点关系
节点的概念:每个XML的标签我们都称之为节点
二、节点选择语法
XPath使⽤路径表达式来选取XML⽂档中的节点或者节点集。这些路径表达式和我们在常规的电脑⽂件系统中看到的表达式⾮常相似。
表达式 | 描述 |
---|
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择⽂档中的节点,⽽不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的⽗节点 |
@ | 选取 |
查找某个特定的节点或者包含某个指定的值的节点
路径表达式 | 结果 |
---|
/bookstore/book[1] | 选取属于 bookstore ⼦元素的第⼀个book元素。 |
/bookstore/book[last()] | 选取属于 bookstore ⼦元素的最后⼀个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore ⼦元素的倒数第⼆个 book 元素。 |
/bookstore/book[position()❤️] | 选取最前⾯的两个属于 bookstore 元素的⼦元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 |
//title[@lang=‘eng’] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book元素,且其中的 price 元素的值须⼤于 35.00。 |
选择未知节点
XPath 通配符可⽤来选取未知的 XML 元素。
通配符 | 描述 |
---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
列出了⼀些路径表达式,以及这些表达式的结果 | |
路径表达式 | 结果 |
---|
/bookstore/* | 选取 bookstore 元素的所有⼦元素。 |
//* | 选取⽂档中的所有元素。 |
html/node()/meta/@* | 选择html下⾯任意节点下的meta节点的所有属性 |
//title[@*] | 选取所有带有属性的 title 元素。 |
xpath的更多语法:xpath更多语法 | |
三、lxml库
- lxml 是 ⼀个HTML/XML的解析器,主要的功能是如何解析和提取HTML/XML 数据。
- 利⽤etree.HTML,将字符串转化为Element对象
- lxml python 官⽅⽂档:https://lxml.de/index.html
- 可使⽤ pip 安装:pip install lxml (或通过wheel⽅式安装)
- lxml 可以⾃动修正 html 代码
xpath语法练习
from lxml import etree
text = """
<div>
<ul>
<li>
<strong>one</strong>
<li class='item-1'>
<a href="http://fenqi.renren.com/" target="_blank">two</a>
</li>
<li>
<a href="https://licai.renren.com/" target="_blank">three</a>
</li>
<li>
<a href="http://www.woxiu.com/" target="_blank">five</a>
</li>
<li>
<a href="http://zhibo.renren.com/" target="_blank">six</a>
</li>
<li class='item-1'>
<a href="http://www.renren.com/" target="_blank">serven</a>
</li>
<li class='item-1'>
<a href="https://www.kaixin.com" target="_blank">eight
</li>
</ul>
"""
html = etree.HTML(text)
print(etree.tostring(html).decode())
ret = html.xpath("//li[@class='item-1']/a/@href")
print(ret)
ret1 = html.xpath("//li[@class='item-1']/a/text()")
print(ret1)
for href in ret:
item = {}
item['href'] = href
item['title'] = ret1[ret.index(href)]
print(item)