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语法规则

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/277056.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023-12-29 服务器开发-Centos部署LNMP环境

摘要: 2023-12-29 服务器开发-Centos部署LNMP环境 centos7.2搭建LNMP具体步骤 1.配置防火墙 CentOS 7.0以上的系统默认使用的是firewall作为防火墙&#xff0c; 关闭firewall&#xff1a; systemctl stop firewalld.service #停止firewall systemctl disable fire…

python读取eps矢量图片

再利用Image读取时&#xff0c;提示报错&#xff1a; OSError: Unable to locate Ghostscript on paths 解决办法&#xff1a; 首先要安裝ghostscript软件&#xff1a;Ghostscript : Downloads 安装后记住安装路径&#xff0c;并找到bin的文件夹 之后在使用时&#xff0c;在代…

linux SHELL语句

shell编程 shell编程 一、初识shell 程序 语言 编程语言 自然语言 汉语 英语 计算机语言 c语言cjava php python go shell 编译型语言 c c java解释型语言 php python bash (不能闭源&#xff0c;开发难度低) 编译型语言:运行编译型语言是相对于解释型语言存在的&#xff…

TVS 管选型与 ESD 防护设计

文章目录 ESD 防护设计 TVS管的基础特性 TVS管的选型方法 TVS管布局细节 参考文献 ESD 防护设计 静电防护设计是让电路板外接的各类金属按钮开关在接触到外界空气放电或接触放电时&#xff0c;在这种瞬间出现的大能量注入到电路板后&#xff0c;能够通过某种设计好的通道泄…

Springboot整合Elastic-job

一 概述 Elastic-Job 最开始只有一个 elastic-job-core 的项目&#xff0c;定位轻量级、无中心化&#xff0c;最核心的服务就是支持弹性扩容和数据分片&#xff01;从 2.X 版本以后&#xff0c;主要分为 Elastic-Job-Lite 和 Elastic-Job-Cloud 两个子项目。esjbo官网地址 Ela…

【满分】【华为OD机试真题2023CD卷 JAVAJS】API集群负载统计

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 API集群负载统计 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 某个产品的RESTful API集合部署在服务器集群的多个节点上,近期对客户端访问日志进行了采集,需要统计各个API的访问频次,根据热点信息在服务…

CRM诞生到现在历经了哪些发展阶段?CRM系统的五个关键节点

CRM管理系统从被发明到现在&#xff0c;历经多次迭代已经成为一个相对成熟的系统。企业可以靠它管理客户信息&#xff0c;提升盈利能力。今天就来介绍一下CRM的发展历程。 一、CRM系统的雏形 广义上的CRM系统其实可以追溯到古希腊时期。当时的商人靠书写记录自己与客户和合作…

亚马逊SEO是什么意思?亚马逊标题的SEO方法是什么?-站斧浏览器

亚马逊SEO是什么意思&#xff1f; 亚马逊SEO主要包括了对标题、描述、五点简介等元素的优化&#xff0c;以及评价和评论的管理等方面。下面将详细分析亚马逊SEO的相关内容&#xff0c;帮助卖家更好地理解和应用。 在亚马逊平台上进行SEO优化需要考虑以下几个方面&#xff1a;…

iPortal内置Elasticsearch启动失败的几种情况——Linux

作者&#xff1a;yx 文章目录 前言一、端口占用二、ES启动过慢三、磁盘占用过高&#xff0c;导致ES变为只读模式 前言 在Linux环境启动iPortal后有时会出现搜索异常的情况&#xff0c;如下截图&#xff0c;这是因为Elasticsearch&#xff08;以下简称“ES”&#xff09;没启动…

elasticsearch安装教程(超详细)

1.1 创建网络&#xff08;单点部署&#xff09; 因为我们还需要部署 kibana 容器&#xff0c;因此需要让 es 和 kibana 容器互联&#xff0c;所有先创建一个网络&#xff1a; docker network create es-net 1.2.加载镜像 采用的版本为 7.12.1 的 elasticsearch&#xff1b;…

日常知识点记录

1、Maven 中的dependencyManagement和dependency的区别 首先maven可以通过子模块依赖父模块的方式获得父模块的所有依赖&#xff0c;极大便利的提供了对项目以来的管理&#xff0c;但是在使用这种方式实现对依赖的管理时&#xff0c;子模块不可避免的会引入父模块中存在&#…

前端性能优化 将资源放到 linux 服务器上 提升访问效率

我们先远端连接服务器 然后服务器终端输入 mkdir 目录路径建出一个新的文件路径 回到我们自己的电脑 然后 在要缓存到服务器的文件目录下打开终端 输入 scp -r ./xidis.hdr 用户名 如果没设置用户名就是root服务器公网IP:/root/xhdr例如 scp -r ./xidis.hdr root1.113.266…

SpringBoot+AOP+Redis 防止重复请求提交

本文项目基于以下教程的代码版本&#xff1a; https://javaxbfs.blog.csdn.net/article/details/135224261 代码仓库: springboot一些案例的整合_1: springboot一些案例的整合 1、实现步骤 2.引入依赖 我们需要redis、aop的依赖。 <dependency><groupId>org.spr…

Docker - 镜像 | 容器 | 数据卷 日常开发常用指令 + 演示(一文通关)

目录 Docker 开发常用指令汇总 辅助命令 docker version docker info docker --help 镜像命令 查看镜像信息 下载镜像 搜索镜像 删除镜像 容器命令 查看运行中的容器 运行容器 停止、启动、重启、暂停、恢复容器 杀死容器 删除容器 查看容器日志 进入容器内部…

记一次修复外网无法访问vmware里面的虚拟机的网络端口的问题

发现一个奇怪的网络问题&#xff0c;vmware里一个程序的端口通过vmnat穿透出来&#xff0c;然后这个端口就能够通过局域网被其他机器访问&#xff0c;但是另一个网段就没法访问这个端口。使用主机上的其他程序使用开启同样的端口&#xff0c;另一个网段的机器却可以访问。我想不…

idea 如何快速拉取新分支

方式1 &#xff08;快捷键&#xff1a;CtrlShift~&#xff09; 方式2:&#xff08;快捷键&#xff1a;Alt9&#xff09;

java Servlet 汽车保养服务平台系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Servlet 汽车保养服务平台系统是一套完善的java web信息管理系统&#xff0c;采用serlvetdaobean mvc模式开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数 据库&#xff0c;系统主要采用B/S模式开发。开发环境为…

Linux系统下隧道代理HTTP

在Linux系统下配置隧道代理HTTP是一个涉及网络技术的话题&#xff0c;主要目的是在客户端和服务器之间建立一个安全的通信通道。下面将详细解释如何进行配置。 一、了解基本概念 在开始之前&#xff0c;需要了解几个关键概念&#xff1a;代理服务器、隧道代理和HTTP协议。代理…

一文带你掌握Flutter dio网络请求库的封装

highlight: an-old-hope 封装网络库考虑的几个方面&#xff1a; 请求参数的封装&#xff1a; 将请求所需的参数进行封装&#xff0c;例如 URL、请求头、请求体等。可以定义一个统一的数据结构或模型类来表示请求参数&#xff0c;以便于传递和管理。 响应结果的封装&#xff…

ChatGPT使用注意事项有哪些?

一、环境注意事项 1、需要构造稳定的环境&#xff0c;很多人说自己的号为什么突然被封&#xff0c;被封的原因是因为有些环境会自动换IP&#xff0c;所以你要设置好 2、搭建美国住宅IP 3、注册时也不要使用香港&#xff0c;最好选择美国、新加坡等地区注册 二、API调用注意事…