python使用xpath解析html

一、安装包

pip install lxml

二、读取

1、读取解析出来多条

from lxml import etree

# HTML 或 XML 文档示例
html_content = '''
<html>
    <body>
        <div>
            <p>Paragraph 1</p>
            <a href="#">Link 1</a>
        </div>
        <div>
            <p>Paragraph 2</p>
            <a href="#">Link 2</a>
        </div>
    </body>
</html>
'''

# 将文档内容加载到 etree 对象中
tree = etree.HTML(html_content)

# 使用 XPath 查询
elements = tree.xpath('/html/body/div/a')  # 示例 XPath 查询
for element in elements:
    print(etree.tostring(element, encoding='utf-8').decode('utf-8'))  # 输出查询到的元素


2、读取一条

from lxml import etree

# HTML示例
html_content = '''
<html>
    <body>
        <div>
            <p>Paragraph 1</p>
            <a href="#">Link 1</a>
        </div>
        <div>
            <p>Paragraph 2</p>
            <a href="#">Link 2</a>
        </div>
    </body>
</html>
'''

# 将文档内容加载到etree对象中
tree = etree.HTML(html_content)

# 使用find方法选择第一个匹配的元素
element = tree.find('.//div/a')  # 示例XPath查询(相对路径) # 示例XPath查询
if element is not None:
    print(etree.tostring(element, encoding='utf-8').decode('utf-8'))  # 输出查询到的元素

在XPath查询中,‘.’ 表示当前节点,‘//’ 表示选择所有符合条件的后代节点。.//div/a 将选择文档中所有

元素下的第一个 元素。这个查询应该能够正确执行并返回第一个匹配的元素。如果有两个那么就是查出来第一个就停止了

3、获取文本内容(.text)

import requests
from lxml import etree

html_content = '''
<html>
    <body>
        <div>
            <p>Paragraph 1</p>
            <a href="#">Link 1</a>
        </div>
        <div>
            <p>Paragraph 2</p>
            <a href="#">Link 2</a>
        </div>
    </body>
</html>
'''

# 将文档内容加载到etree对象中
tree = etree.HTML(html_content)

# 使用find方法选择第一个匹配的元素
element = tree.find('.//div/a')  # 示例XPath查询(相对路径)
if element is not None:
    print(element.text)  # 输出查询到的元素的文本内容

4、获取标签(.tag)

from lxml import etree

# HTML示例
html_content = '''
<html>
    <body>
        <div>
            <p>Paragraph 1</p>
            <a href="#">Link 1</a>
        </div>
        <div>
            <p>Paragraph 2</p>
            <a href="#">Link 2</a>
        </div>
    </body>
</html>
'''

# 将文档内容加载到etree对象中
tree = etree.HTML(html_content)

# 使用XPath选择器找到所需元素
element = tree.xpath('.//div/a')[0]  # 示例XPath查询(相对路径)

# 构造新的element,只包含开始和结束标签
tag = element.tag  # 获取标签名称
start_tag = f'<{
     tag}>'
end_tag = f'</{
     tag}>'
print(start_tag + end_tag)  # 输出 <a></a>

5、获取所有图片(xpath获取图片链接)

from lxml import etree

# 假设html_content为你的HTML内容
html_content = """
<html>
    <body>
        <div>
            <img src="image1.jpg">
            <img src="image2.jpg">
            <img src="image3.jpg">
        </div>
    </body>
</html>
"""

# 解析HTML内容
tree = etree.HTML(html_content)

# 使用XPath获取所有图片链接 表达式为@属性的获取出来的都是文本不是对象不用转换字符串 也可以两个属性 @xxxx = xxx and @xxx=xxxx
image_links = tree.xpath("//img/@src")

# 输出图片链接
print(image_links)

6、获取单张图片的路径(java代码获取属性)

import requests

from lxml import etree
headers = {
   
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
# 网址你自己换一个xpath的话就改下
response = requests.get("https://www.tianqi.com/", headers=headers)

body = etree.HTML(response.text)

elements = body.xpath('//*[@id="hhx_newDaodu_l"]/img[2]')

for element in elements:
    print(element.get("src"))  # 输出查询到的元素

7、标签里面的文字获取出来对应标签

from lxml import html

# 示例 HTML 文档
html_content = """
<html>
    <body>
        <div>
            <p>Hello, World!</p>
            <p>This is a test.</p>
        </div>
    </body>
</html>
"""

# 将 HTML 解析为 lxml 的 Element 对象
tree = html.fromstring(html_content)

# 使用 XPath 查找包含特定文本的元素
elements_with_text = tree.xpath("//*[text()='Hello, World!']")

# 输出找到的元素
for element in elements_with_text:
    print(html.tostring(element))

三、xpath语法规则

在这里插入图片描述

浏览器可以右键获取
在这里插入图片描述

相关推荐

  1. Python爬虫学习(二):xpath解析html

    2023-12-31 19:20:05       12 阅读
  2. python数据解析xpath

    2023-12-31 19:20:05       18 阅读
  3. python爬虫】xpath使用说明

    2023-12-31 19:20:05       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-31 19:20:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-31 19:20:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-31 19:20:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-31 19:20:05       20 阅读

热门阅读

  1. llvm后端之指令选择源码分析

    2023-12-31 19:20:05       42 阅读
  2. element ui级连选择,lazyLoad选择地区

    2023-12-31 19:20:05       41 阅读
  3. MongoDB聚合:$replaceRoot

    2023-12-31 19:20:05       37 阅读
  4. EasyExcel简单合并单元格数据工具类

    2023-12-31 19:20:05       49 阅读
  5. couldn‘t find “libmmkv.so“ android8.1.0 Nexus 5X

    2023-12-31 19:20:05       52 阅读
  6. GTK 使用 glade 4 正确书写的方法

    2023-12-31 19:20:05       39 阅读
  7. Element Plus 的 el-table 组件合并不规律的行

    2023-12-31 19:20:05       38 阅读
  8. Arm CCA机密计算扩展

    2023-12-31 19:20:05       47 阅读
  9. 网络安全试题——附答案

    2023-12-31 19:20:05       34 阅读
  10. leetcode - 1531. String Compression II

    2023-12-31 19:20:05       30 阅读
  11. OpenStack优缺点并与CloudStack的比较

    2023-12-31 19:20:05       35 阅读