当前位置: 首页 > news >正文

python 模块lxml 处理 XML 和 HTML 数据

xpath:https://blog.csdn.net/randy521520/article/details/132432903

一、安装

XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历。

pip install lxml
二、使用案例
from lxml import etree
import requests
import asyncio
import functools
import re
import jsonhouse_info = []'''异步请求获取链家每页数据'''
async def get_page(page_index):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'}request = functools.partial(requests.get, f'https://sh.lianjia.com/ershoufang/pudong/pg{page_index}/',headers=headers)loop = asyncio.get_running_loop()response = await loop.run_in_executor(None, request)return response'''使用xpath获取房屋信息'''
def get_house_info(html):title_list = html.xpath('//a[@data-el="ershoufang"]/text()')  # 房屋titlehouse_pattern_list = html.xpath('//div[@class="houseInfo"]/text()')  # 房屋格局price_list = html.xpath('//div[@class="unitPrice"]/span/text()')  # 房屋单价location_list = html.xpath('//div[@class="positionInfo"]')  # 房屋位置信息total_list = html.xpath('//div[contains(@class,"totalPrice")]')  # 总价for index, item in enumerate(zip(title_list, house_pattern_list, price_list)):location_item = location_list[index]total_item = total_list[index]house_info.append({'title': item[0],'house_pattern': item[1],'price': item[2],'location': location_item.xpath('./a[1]/text()')[0] + location_item.xpath('./a[last()]/text()')[0],'total': total_item.xpath('./span/text()')[0] + total_item.xpath('./i[last()]/text()')[0]})'''异步获取第一页数据,拿到第一页房屋信息,并返回分页总数和当前页'''
async def get_first_page():response = await get_page(1)#etree.HTML 将获取到的html字符串转为可操作的Element对象get_house_info(etree.HTML(response.text))if __name__ == '__main__':asyncio.run(get_first_page())
三、etree 模块
  1. etree.Element(element_name, attrib=None, nsmap=None) 创建element对象
    from lxml import etree
    '''
    element_name:要创建的元素的名称
    attrib:元素的属性字典
    nsmap:命名空间映射字典,用于指定元素的命名空间
    '''
    element = etree.Element('div',attrib={'class':'test'},nsmap={"ns": "http://example.com/ns"})
    
  2. etree.SubElement(parent, element_name, attrib=None, nsmap=None) 创建子元素
    from lxml import etree
    '''
    parent:element对象
    element_name:要创建的元素的名称
    attrib:元素的属性字典
    nsmap:命名空间映射字典,用于指定元素的命名空间
    '''
    element = etree.Element('div', attrib={'class': 'test'}, nsmap={"ns": "http://example.com/ns"})
    span_element = etree.SubElement(element,'span')
    span_element.text = '我是span'
    print(element.xpath('//div/span/text()'))
    
  3. etree.fromstring(text, parser=None,base_url=None) 将XML、HTML字符串解析为Element对象
    from lxml import etree'''
    text:解析的XML字符串
    parse:解析器对象,默认lxml.etree.XMLParser、lxml.etree.HTMLParser
    base_url: 基本URL,用于解析相对URL。如果HTML文档中包含相对URL,解析器将使用base_url来将其转换为绝对URL。如果未提供base_url,则相对URL将保持不变
    '''
    html_str = '<div class="test"><span>我是span</span></div>'
    element = etree.fromstring(html_str)
    print(element.xpath('//div/span/text()'))
    
  4. etree.HTML(text, parser=None, base_url=None) 将HTML字符串解析为Element对象
    from lxml import etree'''
    xml_string:解析的XML字符串
    parse:解析器对象,默认lxml.etree.HTMLParser
    base_url: 基本URL,用于解析相对URL。如果HTML文档中包含相对URL,解析器将使用base_url来将其转换为绝对URL。如果未提供base_url,则相对URL将保持不变
    '''
    html_str = '<div class="test"><span>我是span</span></div>'
    element = etree.HTML(html_str)
    print(element.xpath('//div/span/text()'))
    
  5. etree.XML(text, parser=None, base_url=None) 将XML字符串解析为Element对象
    from lxml import etree'''
    text:解析的XML字符串
    parse:解析器对象,默认lxml.etree.XMLParser
    base_url: 基本URL,用于解析相对URL。如果HTML文档中包含相对URL,解析器将使用base_url来将其转换为绝对URL。如果未提供base_url,则相对URL将保持不变
    '''
    html_str = '<div class="test"><span>我是span</span></div>'
    element = etree.XML(html_str)
    print(element.xpath('//div/span/text()'))
    
  6. etree.parse(source, parser=None, base_url=None) 将XML、HTML字符串解析为ElementTree对象
四、element 对象
  1. element.xpath(path) 执行xpath语法
  2. element.nsmap:获取或设置元素命名空间映射
  3. element.attrib:获取或设置元素属性
  4. element.text:获取或设置文本
  5. element.tag:返回对象名称
  6. element.append(element) 向节点里面追加子节点
  7. element.insert(index,element) 向节点开始的某个位置添加子节点
    from lxml import etreeelement = etree.Element('div', attrib={'class': 'test'})
    span_element = etree.SubElement(element, 'span')
    span_element.text = '我是span'append_child = etree.Element('div', attrib={'class': 'append'})
    append_child.text = '我是append_child'insert_child = etree.Element('div', attrib={'class': 'insert'})
    insert_child.text = '我是insert_child'element.append(append_child)
    element.insert(0,insert_child)
    print(element.xpath('//div/span/text()'))
    print(element.xpath('//div/div[@class="append"]/text()'))
    print(element.xpath('//div/div[@class="insert"]/text()'))
    
  8. element.find(xpath): 在元素的子树中查找与XPath表达式匹配的第一个元素,并返回该元素。如果找不到匹配的元素,则返回None
  9. element.findall(xpath): 在元素的子树中查找与XPath表达式匹配的所有元素,并返回一个列表
  10. element.get(attribute_name, default=None): 获取元素的指定属性的值
  11. element.set(attribute_name, value): 设置元素的指定属性的值
  12. element.iter(tag=None): 迭代元素及其子元素,可选择指定标签进行过滤
  13. element.getparent(): 获取元素的父元素
  14. element.getchildren(): 获取元素的所有子元素
  15. element.getroottree(): 获取包含元素的根元素的Tree对象
五、elementTree 对象
  1. elementTree.root: 根元素的Element对象。可以通过访问tree.root来获取根元素。
  2. elementTree.getroot(): 获取根元素的Element对象。与tree.root属性相同,用于获取根元素
  3. elementTree.find(path): 在整个文档中查找具有指定路径的第一个元素,并返回该元素的Element对象。路径可以使用XPath表达式指定
  4. elementTree.findall(path): 在整个文档中查找具有指定路径的所有元素,并返回这些元素的列表。路径可以使用XPath表达式指定
  5. elementTree.iterfind(path): 在整个文档中迭代查找具有指定路径的元素,并返回这些元素的迭代器。路径可以使用XPath表达式指定
  6. elementTree.write(file, encoding=None, xml_declaration=None, pretty_print=False): 将整个文档写入文件。file参数可以是文件名或文件对象。encoding参数指定写入文件时使用的字符编码。xml_declaration参数指定是否写入XML声明。pretty_print参数指定是否以更易读的格式写入文档
  7. elementTree.tostring(element, encoding=None, method=“xml”, pretty_print=False): 将指定元素及其子元素序列化为字符串。element参数是要序列化的元素。encoding参数指定字符串的字符编码。method参数指定序列化的方法,可以是"xml"(默认)或"html"。pretty_print参数指定是否以更易读的格式序列化。
  8. elementTree.parse(source, parser=None, base_url=None): 静态方法,用于解析XML或HTML文档并返回一个ElementTree对象。与etree.parse函数的用法相同
六、parse 解析器对象
  1. lxml.etree.XMLParser: 用于解析XML文档的默认解析器。它支持标准的XML解析,并提供了丰富的功能和选项,如命名空间支持、DTD验证等。
  2. lxml.etree.HTMLParser: 用于解析HTML文档的默认解析器。它专门针对HTML进行了优化,并具有处理HTML特性的功能,如自动修复破碎的标签、处理实体引用等。
  3. lxml.etree.XMLPullParser: 一种事件驱动的解析器,用于逐行解析XML文档。它提供了一个迭代器接口,可以逐行读取和处理XML文档。
  4. lxml.etree.HTMLPullParser: 一种事件驱动的解析器,用于逐行解析HTML文档。它提供了一个迭代器接口,可以逐行读取和处理HTML文档。

相关文章:

python 模块lxml 处理 XML 和 HTML 数据

xpath&#xff1a;https://blog.csdn.net/randy521520/article/details/132432903 一、安装 XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言&#xff0c;可用来在 HTML\XML 文档中对元素和属性进行遍历。 pip install lxml二、使用案例 from lxml impo…...

SpringBoot 统⼀功能处理

统⼀功能处理 1. 拦截器2. 统⼀异常处理3. 统⼀数据返回格式 1. 拦截器 Spring 中提供了具体的实现拦截器&#xff1a;HandlerInterceptor&#xff0c;拦截器的实现分为以下两个步骤&#xff1a; 创建⾃定义拦截器&#xff0c;实现 HandlerInterceptor 接⼝的 preHandle&…...

hadoop 报错 java.io.IOException: Inconsistent checkpoint fields

背景: 使用了格式化,导致首重了新的集群ID org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /work1/home/hadoop/dfs/data/current/BP-1873526852-172.16.21.30-1692769875005 is in an inconsistent state: namespaceID is incompatible with …...

workbench连接MySQL8.0错误 bad conversion 外部组件 异常

阿里云搭建MySQL实用的版本是8.0 本地安装的版本是: workbench 6.3 需要升级到&#xff1a; workbench 8.0 https://dev.mysql.com/downloads/workbench/...

Qt Scroll Area控件设置,解决无法显示全部内容,且无法滚动显示问题。

前言&#xff0c;因为要显示很多条目的内容&#xff0c;原来是用Vertical Layout控件里面嵌套Horizontal layout显示了很多行控件&#xff0c;发现最简单的方法就是使用滚动条控件&#xff0c;但是无论如何调整需要滚动的控件高度&#xff0c;始终无法滚动显示内容。也就是说添…...

【Java架构-包管理工具】-Maven私服搭建-Nexus(三)

本文摘要 Maven作为Java后端使用频率非常高的一款依赖管理工具&#xff0c;在此咱们由浅入深&#xff0c;分三篇文章&#xff08;Maven基础、Maven进阶、私服搭建&#xff09;来深入学习Maven&#xff0c;此篇为开篇主要介绍Maven私服搭建-Nexus 文章目录 本文摘要1. Nexus安装…...

守护进程(精灵进程)

目录 前言 1.如何理解前台进程和后台进程 2.守护进程的概念 3.为什么会存在守护进程 4.如何实现守护进程 5.测试 总结 前言 今天我们要介绍的是关于守护进程如何实现&#xff0c;可能有小伙伴第一次听到守护进程这个概念&#xff0c;感觉很懵&#xff0c;知道进程的概念&…...

csdn冷知识:如何在csdn里输入公式或矩阵

目录 1 输入公式 2 输入矩阵 3 如何输入复杂公式 4 如何修改&#xff0c;已经生成的公式 1 输入公式 进入编辑模式点击右边的菜单&#xff1a;公式然后进入公式编辑器&#xff0c;选择右边的 ... 可以选择大括号等&#xff0c;右边还有矩阵符号选择后你需要创建几行几列的…...

【前端】CSS技巧与样式优化

目录 一、前言二、精灵图1、什么是精灵图2、为什么需要精灵图3、精灵图的使用①、创建CSS精灵图的步骤1&#xff09;、选择合适的图标2&#xff09;、合并图片3&#xff09;、设置背景定位 ②、优化CSS精灵图的技巧1&#xff09;、维护方便2&#xff09;、考虑Retina屏幕3&…...

Linux下的系统编程——makefile入门

前言&#xff1a; 或许很多Winodws的程序员都不知道这个东西&#xff0c;因为那些Windows的IDE都为你做了这个工作&#xff0c;但我觉得要作一个好的和professional的程序员&#xff0c;makefile还是要懂。这就好像现在有这么多的HTML的编辑器&#xff0c;但如果你想成为一个专…...

redis常用五种数据类型详解

目录 前言&#xff1a; string 相关命令 内部编码 应用场景 hash 相关命令 内部编码 应用场景 list 相关命令 内部编码 应用场景 set 相关命令 内部编码 应用场景 Zset 相关命令 内部编码 应用场景 渐进式遍历 前言&#xff1a; redis有多种数据类型&…...

Python代理池健壮性测试 - 压力测试和异常处理

大家好&#xff01;在构建一个可靠的Python代理池时&#xff0c;除了实现基本功能外&#xff0c;我们还需要进行一系列健壮性测试来确保其能够稳定运行&#xff0c;并具备应对各种异常情况的能力。本文将介绍如何使用压力测试工具以及合适的异常处理机制来提升Python代理池的可…...

回文子串-中心拓展

给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不…...

2023.8各大浏览器11家对比:Edge/Chrome/Opera/Firefox/Tor/Vivaldi/Brave,安全性,速度,体积,内存占用

测试环境&#xff1a;全默认设置的情况下&#xff0c;均在全新的系统上进行测试&#xff0c;系统并未进行任何改动&#xff0c;没有杀毒软件&#xff0c;浏览器进程全部在后台&#xff0c;且为小窗模式&#xff0c;小窗分辨率均为浏览器厂商默认缩放大小(变量不唯一)&#xff0…...

python中的matplotlib画散点图(数据分析与可视化)

python中的matplotlib画散点图&#xff08;数据分析与可视化&#xff09; import numpy as np import pandas as pd import matplotlib.pyplot as pltpd.set_option("max_columns",None) plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]Fa…...

2023前端面试笔记 —— HTML5

系列文章目录 内容链接2023前端面试笔记HTML5 文章目录 系列文章目录前言一、HTML 文件中的 DOCTYPE 是什么作用二、HTML、XML、XHTML 之间有什么区别三、前缀为 data- 开头的元素属性是什么四、谈谈你对 HTML 语义化的理解五、HTML5 对比 HTML4 有哪些不同之处六、meta 标签有…...

【LeetCode】面试题总结 消失的数字 最小k个数

1.消失的数字 两种思路 1.先升序排序&#xff0c;再遍历并且让后一项与前一项比较 2.转化为数学问题求等差数列前n项和 &#xff08;n的大小为数组的长度&#xff09;&#xff0c;将根据公式求得的应有的和数与数组中实际的和作差 import java.util.*; class Solution {public …...

导入功能importExcel (现成直接用)

1. 实体类字段上加 Excel(name "xxx"), 表示要导入的字段 Excel(name "用户名称")private String nickName; 2. controller (post请求) /*** 导入用户数据** param file 文件* param updateSupport 是否更新支持&#xff0c;如果已存在&#xff0c;则进…...

cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 之一开头

不能飞的猪只是没用的猪。 —— 宫崎骏 《红猪》 常见的1种case 记录一下&#xff0c;新电脑安装android studio导入公司那些gradle还是5.5左右的工程以后&#xff0c;各种不适应。编译问题出现了。老电脑都是好好的。 cvc-complex-type.2.4.a: 发现了以元素 ‘base-extensi…...

cortex-A7核IIC实验

iic.h&#xff1a; #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h"/* 通过程序模拟实现I2C总线的时序和协议* GPIOF ---> AHB4* I2C1_SCL ---> PF14* I2C1_SDA ---> PF15** */#define SET_SDA_…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...