Python:XPath与lxml类库(二)
XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言 可用来在 XML 文档中对元素和属性进行遍历。
W3School官方文档 http://www.w3school.com.cn/xpath/index.asp
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
下面列出了最常用的路径表达式
在下面的表格中 我们已列出了一些路径表达式以及表达式的结果
谓语用来查找某个特定的节点或者包含某个指定的值的节点 被嵌在方括号中。
在下面的表格中 我们列出了带有谓语的一些路径表达式 以及表达式的结果
XPath 通配符可用来选取未知的 XML 元素。
在下面的表格中 我们列出了一些路径表达式 以及这些表达式的结果
通过在路径表达式中使用“|”运算符 您可以选取若干个路径。
实例
在下面的表格中 我们列出了一些路径表达式 以及这些表达式的结果
下面列出了可用在 XPath 表达式中的运算符
这些就是XPath的语法内容 在运用到Python抓取时要先转换为xml。
lxml 是 一个HTML/XML的解析器 主要的功能是如何解析和提取 HTML/XML 数据。
lxml和正则一样 也是用 C 实现的 是一款高性能的 Python HTML/XML 解析器 我们可以利用之前学习的XPath语法 来快速的定位特定元素以及节点信息。
lxml python 官方文档 http://lxml.de/index.html
需要安装C语言库 可使用 pip 安装 pip install lxml 或通过wheel方式安装
我们利用它来解析 HTML 代码 简单示例
# lxml_test.py # 使用 lxml 的 etree 库 from lxml import etree text div li class item-0 a href link1.html first item /a /li li class item-1 a href link2.html second item /a /li li class item-inactive a href link3.html third item /a /li li class item-1 a href link4.html fourth item /a /li li class item-0 a href link5.html fifth item /a # 注意 此处缺少一个 /li 闭合标签 /ul /div #利用etree.HTML 将字符串解析为HTML文档 html etree.HTML(text) # 按字符串序列化HTML文档 result etree.tostring(html) print(result)
输出结果
html body div li class item-0 a href link1.html first item /a /li li class item-1 a href link2.html second item /a /li li class item-inactive a href link3.html third item /a /li li class item-1 a href link4.html fourth item /a /li li class item-0 a href link5.html fifth item /a /li /ul /div /body /html
lxml 可以自动修正 html 代码 例子里不仅补全了 li 标签 还添加了 body html 标签。
除了直接读取字符串 lxml还支持从文件里读取内容。我们新建一个hello.html文件
!-- hello.html -- div li class item-0 a href link1.html first item /a /li li class item-1 a href link2.html second item /a /li li class item-inactive a href link3.html span class bold third item /span /a /li li class item-1 a href link4.html fourth item /a /li li class item-0 a href link5.html fifth item /a /li /ul /div
再利用 etree.parse() 方法来读取文件。
# lxml_parse.py from lxml import etree # 读取外部文件 hello.html html etree.parse( ./hello.html ) result etree.tostring(html, pretty_print True) print(result)
输出结果与之前相同
html body div li class item-0 a href link1.html first item /a /li li class item-1 a href link2.html second item /a /li li class item-inactive a href link3.html third item /a /li li class item-1 a href link4.html fourth item /a /li li class item-0 a href link5.html fifth item /a /li /ul /div /body /html
1. 获取所有的
标签# xpath_li.py from lxml import etree html etree.parse( hello.html ) print type(html) # 显示etree.parse() 返回类型 result html.xpath( //li ) print result # 打印 li 标签的元素集合 print len(result) print type(result) print type(result[0])
输出结果
type lxml.etree._ElementTree [ Element li at 0x1014e0e18 , Element li at 0x1014e0ef0 , Element li at 0x1014e0f38 , Element li at 0x1014e0f80 , Element li at 0x1014e0fc8 ] type list type lxml.etree._Element
2. 继续获取
标签的所有 class属性# xpath_li.py from lxml import etree html etree.parse( hello.html ) result html.xpath( //li/ class ) print result
运行结果
[ item-0 , item-1 , item-inactive , item-1 , item-0 ]
# xpath_li.py from lxml import etree html etree.parse( hello.html ) result html.xpath( //li/a[ href link1.html ] ) print result
运行结果
[ Element a at 0x10ffaae18 ]
4. 获取 li 标签下的所有 span 标签
# xpath_li.py from lxml import etree html etree.parse( hello.html ) #result html.xpath( //li/span ) #注意这么写是不对的 #因为 / 是用来获取子元素的 而 span 并不是 li 的子元素 所以 要用双斜杠 result html.xpath( //li//span ) print result
运行结果
[ Element span at 0x10d698e18 ]
5. 获取 li 标签下的 a 标签里的所有 class
# xpath_li.py from lxml import etree html etree.parse( hello.html ) result html.xpath( //li/a// class ) print result
运行结果
[ blod ]
6. 获取最后一个 li 的 a 的 href
# xpath_li.py from lxml import etree html etree.parse( hello.html ) result html.xpath( //li[last()]/a/ href ) # 谓语 [last()] 可以找到最后一个元素 print result
运行结果
[ link5.html ]
7. 获取倒数第二个元素的内容
# xpath_li.py from lxml import etree html etree.parse( hello.html ) result html.xpath( //li[last()-1]/a ) # text 方法可以获取元素内容 print result[0].text
运行结果
fourth item
8. 获取 class 值为 bold 的标签名
# xpath_li.py from lxml import etree html etree.parse( hello.html ) result html.xpath( //*[ class bold ] ) # tag方法可以获取标签名 print result[0].tag
运行结果
span
Python Xpath解析 数据提取 使用介绍&常用示例 Python Xpath解析 数据提取 使用介绍&常用示例 一、from lxml import etree 1.pip install lxml 2.xpath用法介绍 2.1 选取节点 2.1 路径表达式结合元素介绍 3.代码示例 4.Xpath Helper (免费 Chrome 插件)
Python 文档解析:lxml库的使用 lxml 是 Python 常用的文档解析库,能够高效地解析 HTML/XML 文档,常用于 Python 爬虫。lxml 为第三方库,需要我们通过pip命令安装。这个爬虫程序爬取了CSDN首页的所有.jpg、.jpeg、.png格式的图片,快来自己尝试一下吧!
Lansonli CSDN大数据领域博客专家,华为云享专家、阿里云专家博主、腾云先锋(TDP)核心成员、51CTO专家博主,全网六万多粉丝,知名互联网公司大数据高级开发工程师
相关文章
- Python自制成语接龙小游戏
- Python 动态获取对象的属性和方法(内含inspect)
- Python工作日类库Busines Holiday介绍
- python 利用 setup.py 手动安装第三方类库
- Python: IP <=> int
- 终于,手把手教会 HR 实现 Python + Excel 「邮件自动化」发工资条了
- Python数据可视化 Pyecharts 系列配置
- Python 教程之在 4 分钟内用 Python 编写复杂模式的简单方法。
- vscode中设置Python解释器
- Python——项目开发中常用的精华Python库介绍与整理.
- Python基础学习
- Python基础语法详尽总结和实战
- python pip 国外慢,国内每次带一串,如何一劳永逸
- python进程池:multiprocessing.pool
- python基础-列表推导式
- 对比3种接口测试的工具:jmeter+ant;postman;python的requests+unittest或requests+excel
- python4delphi Python could not be properly initialized. We must quit.