爬虫(六):XPath、lxml模块
1. xpath
1.1 什么是xpath
xpath(xml path language) 是一门在xml和html文档中查找信息的语言,可用来在xml和html文档中对元素和属性进行遍历。
1.2 xpath开发工具
1.2.1 chrome插件xpath helper
1.2.2 firefox插件xpath checker
1.3 xpath语法
这个就要看我写的selenium基础中的文章了。
2. lxml模块
lxml是一个html/xml的解析库,主要功能是如何解析和提取html/xml数据。
lxml和正则是一样,也是用c语言实现的,是一款高性能的python html/xml解析器,可以利用之前学习的xpath语法,来快速定位特定元素以及节点信息。
可通过 pip 安装:
pip install lxml -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
2.1 基本使用
我们可以利用它来解析html 代码,且在解析 html 代码的时候,如果 html 代码不规范,他会自动进行补全。
from lxml.html import etree htmltext = ''' <div> <ul> <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(htmltext) # 按字符串序列化 html 文档 result = etree.tostring(html, encoding='utf-8', pretty_print=true).decode('utf-8') print(result)
2.2 在文件中读取html代码
除了直接使用字符串进行解析,lxml 还支持从文件中读取内容。
html代码:
<!doctype html> <html lang="zh-cn"> <head> <meta charset="utf-8"> <title></title> </head> <body> <div> <ul> <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>
然后利用etree.parse()方法来读取文件。
from lxml.html import etree html = etree.parse('./hello.html') result = etree.tostring(html, encoding='utf-8', pretty_print=true).decode('utf-8') print(result)
结果:
我们看到居然报错了,为什么呢?
之所以使用etree.parse()方法解析 html 内容时,会报lxml.etree.xmlsyntaxerror的错,是因为etree.parse()默认使用的是xml的解析器,所以当html内容不规范,比如出现某个标签缺少闭合标签时,就会报这个错误。这时,可使用etree.htmlparser()创建一个html的解析器,然后作为etree.parse()方法的参数即可。
from lxml.html import etree htmlparser = etree.htmlparser(encoding='utf-8') html = etree.parse('./hello.html', parser=htmlparser) result = etree.tostring(html, encoding='utf-8', pretty_print=true).decode('utf-8') print(result)
2.3 在lxml中使用xpath语法
使用xpath语法,应该使用element.xpath语法,来执行xpath的选择。
xpath函数返回的永远是一个列表。
我们先来匹配下li标签和a标签
from lxml.html import etree htmlparser = etree.htmlparser(encoding='utf-8') html = etree.parse('./hello.html', parser=htmlparser) lis = html.xpath('//li') for li in lis: print(etree.tostring(li, encoding='utf-8', pretty_print=true).decode('utf-8'), end='') alist = html.xpath('//a/@href') for a in alist: print(a)
获得li标签下a标签的href属性和内容:
from lxml.html import etree htmlparser = etree.htmlparser(encoding='utf-8') html = etree.parse('./hello.html', parser=htmlparser) lis = html.xpath('//li') for li in lis: # . 号表示在当前的 li 元素下去匹配 href = li.xpath('.//a/@href')[0] #获取 a 标签的 href 属性 txt = li.xpath('.//a/text()')[0] #获取 a 标签的文本 print(href, txt)
下一篇: Java集合框架(Java总结五)
推荐阅读
-
Python爬虫基础之XPath语法与lxml库的用法详解
-
爬虫 结构化 数据 非结构化数据 XPath lxml 类库
-
Python爬虫使用lxml模块爬取豆瓣读书排行榜并分析
-
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
-
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
-
爬虫(六):XPath、lxml模块
-
爬虫常用模块:requests ,cookie处理,xlwt(写入excel), lxml
-
Python爬虫基础之XPath语法与lxml库的用法详解
-
Python爬虫之lxml-etree和xpath的结合使用(附案例)
-
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】