xpath常用规则
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
…或者parent:: | 选取当前节点的父节点 |
@ | 选取属性 |
etree模块(对html文档规范化补缺)
etree模块可以自动修正html文本,看下面实例代码
from lxml import etree
text = ' <div class="nav_com">
<ul>
<li class="active"><a href="/">推荐</a></li>
<li class=""><a href="/nav/watchers">关注</a></li>
<li class=""><a href="/nav/career">程序人生</a></li>
<li class=""><a href="/nav/python">Python</a></li> '
html = etree.HTML(text)
result = etree.tostring(html)#tostring输出字节流
print(result.decode('utf-8'))#解码后打印
也可以直接读取文件:
from lxml import etree
html = etree.parse('1.html', etree.HTMLParser())
result = etree.tostring(html)#tostring输出字节流
print(result.decode('utf-8'))#解码后打印
xpath与BeautifulSoup的text()函数差别
xpath中的text()选取两种方法
- 一定要具体到标签中选择
- 选取子孙节点//再选取text(),这样的弊端就是得到的数据可能不整洁,带有换行符\n
BeautifulSoup中的text()自动选取所有子孙节点
属性多值匹配
contains函数
//li[contains(@class, "li")]/a/@href
多属性匹配
//li[contains(@class, "li") and @name='item'] /a/@href
按序选择
//li[1]/a
//li[last()]/a
//li[last()-2]/a
//li[position()<3]/a