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 json

house_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()')  # 房屋title
    house_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 etree
    
    element = 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文档。
相关推荐
yvestine15 分钟前
自然语言处理——文本表示
人工智能·python·算法·自然语言处理·文本表示
zzc92123 分钟前
MATLAB仿真生成无线通信网络拓扑推理数据集
开发语言·网络·数据库·人工智能·python·深度学习·matlab
编程有点难38 分钟前
Python训练打卡Day43
开发语言·python·深度学习
2301_805054561 小时前
Python训练营打卡Day48(2025.6.8)
pytorch·python·深度学习
LjQ20401 小时前
网络爬虫一课一得
开发语言·数据库·python·网络爬虫
哆啦A梦的口袋呀1 小时前
基于Python学习《Head First设计模式》第九章 迭代器和组合模式
python·学习·设计模式
sponge'2 小时前
opencv学习笔记2:卷积、均值滤波、中值滤波
笔记·python·opencv·学习
databook2 小时前
概率图模型:机器学习的结构化概率之道
python·机器学习·scikit-learn
拾回程序猿的圈圈∞2 小时前
实战二:开发网页端界面完成黑白视频转为彩色视频
python·ai编程
亚林瓜子2 小时前
AWS Elastic Beanstalk + CodePipeline(Python Flask Web的国区CI/CD)
python·ci/cd·flask·web·aws·beanstalk·codepipeline