目录
xpath表达式
xpath介绍和lxml安装
xpath介绍
# xpath表达式 只能处理HTML文档,但是比正则表达式更加简单
# xpath是将HTML文档转换成XML文档,然后xpath查找HTML节点或元素
# 按照xpath:pip install lxml
lxml安装
xpath表达式是基于lxml模块的
在DOS窗口使用命令:pip install lxml
解析字符串格式的HTML
from lxml import etree
# 注意,可能由于版本的原因,pycharm无法成功导入使用etree,那么可以降低lxml版本
# etree.HTML()将字符串解析成了特殊的HTML对象
h = etree.HTML("<a href='#'>Hello World,Hello 张三</a>")
# etree.tostring()将HTML对象转成字符串格式
print(etree.tostring(h, encoding="utf-8")) # encoding="utf-8"处理中文
控制台打印:
b'<html><body><a href="#">Hello World,Hello \xe5\xbc\xa0\xe4\xb8\x89</a></body></html>'
解析本地HTML文件
data.html
<head>
<title>测试</title>
</head>
<body>
<h1>这是一个测试HTML文档</h1>
</body>
</html>
python代码:
from lxml import etree
# 解析本地HTML文件
# 创建HTML解析器,如果不创建将按照XML来解析会报错
parser = etree.HTMLParser(encoding="utf-8")
# 获取本地HTML文档
html = etree.parse(r"data.html", parser=parser)
# 将HTML对象转换成字符串格式
print(etree.tostring(html, encoding="utf-8").decode())
控制台打印:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head>
<title>测试</title>
</head>
<body>
<h1>这是一个测试HTML文档</h1>
</body>
</html>
按标签名获取内容
data.html
<head>
<title>测试</title>
</head>
<body>
<h1>这是一个测试HTML文档</h1>
<h2>这是一个测试HTML文档</h2>
<h2>这是一个测试python文档</h2>
<h3>这是一个测试HTML文档</h3>
<h4>这是一个测试HTML文档</h4>
<h5>这是一个测试HTML文档</h5>
<h6>这是一个测试HTML文档</h6>
</body>
</html>
python代码
from lxml import etree
# 解析本地HTML文件
# 创建HTML解析器,如果不创建将按照XML来解析会报错
parser = etree.HTMLParser(encoding="utf-8")
# 获取本地HTML文档
html = etree.parse(r"data.html", parser=parser)
# 获取所有的h2标签的信息,返回一个列表
result = html.xpath("//h2")
# 获取第一个h2标签的内容
print(result[0].text)
# 循环遍历列表
for i in result:
print(i.text) # text是打印值
控制台打印:
这是一个测试HTML文档
这是一个测试HTML文档
这是一个测试python文档
按属性获取标签
data.html
<head>
<title>测试</title>
</head>
<body>
<ul>
<li class="item-1">唐僧</li>
<li class="item-2"><a href="#">孙悟空</a></li>
<li class="item-3">猪八戒</li>
<li class="item-4">沙僧</li>
<li class="item-5">小白龙</li>
</ul>
</body>
</html>
python代码:
from lxml import etree
# 解析本地HTML文件
# 创建HTML解析器,如果不创建将按照XML来解析会报错
parser = etree.HTMLParser(encoding="utf-8")
# 获取本地HTML文档
html = etree.parse(r"data.html", parser=parser)
# 获取li标签中的class="item-3"的标签
result = html.xpath("//li[@class='item-3']") # 其中li是标签名,class是属性名
# 打印
print(result[0].text)
# 获取li标签下的所有a标签,其中属性值为href="#"
result2 = html.xpath("//li/a[@href='#']") # //li/a表示li标签下的a标签,[]内放属性值,其中以@符合标记
# 打印
print(result2[0].text)
控制台打印:
猪八戒
孙悟空
获取标签的属性
data.html
<head>
<title>测试</title>
</head>
<body>
<ul>
<li class="item-1">唐僧</li>
<li class="item-2"><a href="#">孙悟空</a></li>
<li class="item-3">猪八戒</li>
<li class="item-4">沙僧</li>
<li class="item-5">小白龙</li>
</ul>
</body>
</html>
python代码
from lxml import etree
# 获取标签的属性
# 创建HTML解析器,如果不创建将按照XML来解析会报错
parser = etree.HTMLParser(encoding="utf-8")
# 获取本地HTML文档
html = etree.parse(r"data.html", parser=parser)
# 获取li标签的class属性
result = html.xpath("//li/@class") # 其中li是标签名,class是属性名
# 打印
print(result)
控制台打印:
['item-1', 'item-2', 'item-3', 'item-4', 'item-5']
获取子标签
data.html
<head>
<title>测试</title>
</head>
<body>
<ul>
<li class="item-1">唐僧</li>
<li class="item-2"><a href="#">孙悟空</a></li>
<li class="item-3">猪八戒</li>
<li class="item-4">沙僧</li>
<li class="item-5">小白龙</li>
</ul>
</body>
</html>
python代码
from lxml import etree
# 获取子标签
# / 一个斜杠表示获取下一级的子标签
# // 两个斜杠表示获取所有符合条件的子标签
# 创建HTML解析器,如果不创建将按照XML来解析会报错
parser = etree.HTMLParser(encoding="utf-8")
# 获取本地HTML文档
html = etree.parse(r"data.html", parser=parser)
# 获取li标签下的a标签
result = html.xpath("//li/a") # 其中li是标签名,a是li标签下的子标签
# 打印
print(result[0].text)
# 获取ul下所有的a标签
result2=html.xpath("//ul//a")
print(result2[0].text)
控制台打印:
孙悟空
孙悟空
获取标签内容和标签名
data.html
<head>
<title>测试</title>
</head>
<body>
<ul>
<li class="item-1">唐僧</li>
<li class="item-2"><a href="#">孙悟空</a></li>
<li class="item-3">猪八戒</li>
<li class="item-4">沙僧</li>
<li class="item-5">小白龙</li>
</ul>
</body>
</html>
python代码
from lxml import etree
# 获取标签内容和标签名
# 创建HTML解析器,如果不创建将按照XML来解析会报错
parser = etree.HTMLParser(encoding="utf-8")
# 获取本地HTML文档
html = etree.parse(r"data.html", parser=parser)
# 获取第四个li元素下的a标签的内容
result = html.xpath("//li[last()-3]/a") # 其中li是标签名,a是li标签下的子标签
# 打印
print(result[0].text)
# 获取class值为item-3的标签名
result2 = html.xpath("//*[@class='item-3']") # *表示获取所有标签,[@class='item-3']为条件即所有class为item-3的标签
print(result2[0].tag) # tag是获取标签名
控制台打印:
孙悟空
li