LXML解析库使用的是Xpath语法:
XPath 是一门语言
XPath可以在XML文档中查找信息
XPath支持HTML
XPath通过元素和属性进行导航
XPath可以用来提取信息
XPath比正则表达式厉害
XPath比正则表达式简单
lxml使用方法:
from lxml import etree text = ''' <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> </ul> </div> ''' html = etree.HTML(text) #使用etree.HTML初始化 result = etree.tostring(html) #将初始化的HTML转化成string print result
首先我们使用 lxml 的 etree 库,然后利用 etree.HTML 初始化,然后我们将其打印出来。
其中,这里体现了 lxml 的一个非常实用的功能就是自动修正 html 代码,大家应该注意到了,最后一个 li 标签,其实我把尾标签删掉了,是不闭合的。不过,lxml 因为继承了 libxml2 的特性,具有自动修正 HTML 代码的功能。
所以输出结果是这样的
<html><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>
#不仅补全了 li 标签,还添加了 body,html 标签。
如何使用XPATH:
安装lxml库
from lxml import etree
Selector = etree.HTML(网页源代码)
Selector.xpath(一段神奇的符号)
XPath与HTML结构
获取网页元素的Xpath
应用XPath提取内容
案例1:
html = '''<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>测试-常规用法</title> </head> <body> <div id="content"> <ul id="useful"> <li>这是第一条信息</li> <li>这是第二条信息</li> <li>这是第三条信息</li> </ul> <ul id="useless"> <li>不需要的信息1</li> <li>不需要的信息2</li> <li>不需要的信息3</li> </ul> <div id="url"> <a href="http://jikexueyuan.com">极客学院</a> <a href="http://jikexueyuan.com/course/" title="极客学院课程库">点我打开课程库</a> </div> </div> </body> </html> ''' selector = etree.HTML(html) #提取文本 提取文本内容:/text() content= selector.xpath('//ul[@id="useless"]/li/text()') #提取id属性为useless下面li标签的文本信息 content1 = selector.xpath('//ul/li/text()') #提取所有li标签的文本信息 content2 = selector.xpath('//div[@id="content"]/ul[@id="useful"]/li/text()') #提取id属性为useful下面li标签的文本信息 for each in content2: print each #提取属性 link = selector.xpath('//a/@href') #提取属性内容: /@xxxx for each in link: print each title = selector.xpath('//a/@title') #提取属性内容: /@xxxx print title[0]
xpath基本语法
//定位根节点
/往下层寻找
提取文本内容:/text()
提取属性内容: /@xxxx
===================
xpath的特殊用法
1.以相同的字符开头
2.标签套标签
案例1
html1 = ''' <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>测试-特殊用法</title> </head> <body> <div id="test-1">需要的内容1</div> <div id="test-2">需要的内容2</div> <div id="testfault">需要的内容3</div> </body> </html> ''' selector = etree.HTML(html1) content = selector.xpath('//div[starts-with(@id,"test")]/text()') for each in content: print each
案例2:
html2 = ''' <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <div id="test3"> 我左青龙, <span id="tiger"> 右白虎, <ul>上朱雀, <li>下玄武。</li> </ul>老牛在当中, </span>龙头在胸口。 </div> </body> </html> ''' selector1=etree.HTML(html2) content1 = selector1.xpath('//div[@id="test3"]/text()') for each in content1: print each data = selector1.xpath('//div[@id="test3"]')[0] info = data.xpath('string(.)') print info