python爬虫(4)——xpath表达式

目录

xpath表达式

xpath介绍和lxml安装

xpath介绍

lxml安装

解析字符串格式的HTML

解析本地HTML文件

按标签名获取内容

按属性获取标签

获取标签的属性

获取子标签

获取标签内容和标签名


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>&#13;
    <title>测试</title>&#13;
</head>&#13;
<body>&#13;
    <h1>这是一个测试HTML文档</h1>&#13;
</body>&#13;
</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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值