目录
1. lxml库
lxml是功能最丰富且易于使用的库,用于处理Python语言中的XML和HTML,还可实现WEB爬取,简言之主要功能是解析和提取 HTML/XML 数据,官文参考:https://lxml.de/index.html,完整的PDF文档下载链接https://lxml.de/lxmldoc-4.5.0.pdf,但是阅读起来……em……怪自己不够聪明的样子。
Linux下安装lxml库:[root@chengyu ~]# pip3 install lxml
1.1 XPath简介
XPath全称XML Path Language,即XML路径语言,可以快速的在XML和HTML文档中搜索特定元素以及节点信息数据,XPath的主要目的是解决XML树和JSON树的节点,XPath 提供超过 100 个内建的函数,用于字符串值、数值、日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等,官文参考https://www.w3.org/TR/xpath/all/。
XPath 有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点,XPath 使用路径表达式在 XML 文档中选取节点,节点是通过沿着路径或者 step 来选取的,常用的规则如下(本节理论部分参考《Python 3 网络爬虫开发实战》和https://www.runoob.com/xpath/xpath-tutorial.html):
表达式 | 描述 |
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
下面以给出路径表达式的一些实例:
路径表达式 | 结果 |
---|---|
booklist | 选取booklist元素的所有子节点。 |
/booklist | 选取根元素booklist。 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
booklist/book | 选取属于booklist的子元素的所有book元素。 |
//book | 选取所有book子元素,而不管它们在文档中的位置。 |
booklist//book | 选择属于booklist元素的后代的所有book元素,而不管它们位于booklist之下的什么位置。 |
//@align | 选取名为align的所有属性。 |
所有节点、指定节点、子节点、父节点获取案例:
# -*- coding: utf-8 -*-
# @Author : ChengYu
# @File : lxml_xpath.py
# @Project: Python Notes
# @Time : 2020/5/6 17:23:39
from lxml import etree
text = '''
<tr>
<td align="left"><a href="oneauthor.php?authorid=1322620" target="_blank">墨香铜臭</a></td>
<td align="left"><a href="onebook.php?novelid=3200611" target="_blank" title="简介:为你,所向披靡!标签:">天官赐福</a></td>
<td align="center">原创-纯爱-架空历史-爱情</td>
<td align="center">轻松</td>
<td align="center"><font color="red">已完成</font></td>
<td align="right">1144742</td>
<td align="right">32416696320</td>
<td align="center">2017-06-16 18:01:18</td>
</tr>
'''
html = etree.HTML(text)
res = html.xpath('//*') # 所有节点获取
res_td = html.xpath('//td') # 指定节点获取
res_td_a = html.xpath('//td/a') # 子节点获取
res_up = html.xpath('//a[@href="oneauthor.php?authorid=1322620"]/parent::*/@align') # 获取父节点
print(res)
print(res_td)
print(res_td[1])
print(res_td_a)
print(res_up)
“Run”结果:
G:\Python3.8.2\python.exe "G:/pycharm/Python Notes/lxml_xpath.py"
[<Element html at 0x246a0deccc0>, <Element body at 0x246a11081c0>, <Element tr at 0x246a1108240>, <Element td at 0x246a1108300>, <Element a at 0x246a1108340>, <Element td at 0x246a11083c0>, <Element a at 0x246a1108400>, <Element td at 0x246a1108440>, <Element td at 0x246a1108480>, <Element td at 0x246a1108380>, <Element font at 0x246a11084c0>, <Element td at 0x246a1108500>, <Element td at 0x246a1108540>, <Element td at 0x246a1108580>]
[<Eleme