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文档。
相关推荐
青瓷程序设计14 小时前
【交通标志识别系统】python+深度学习+算法模型+Resnet算法+人工智能+2026计算机毕设项目
人工智能·python·深度学习
啥都想学点14 小时前
关于制作技术视频讲解的问卷调查
python
喵手14 小时前
Python爬虫实战:博物馆官网的“展览预告/正在热展”栏目,抓取展览名称、精确展期、具体展厅位置以及票务/预约规则(附CSV导出)!
爬虫·python·爬虫实战·零基础python爬虫教学·博物馆信息采集·采集展览预告/正在热展等·采集数据csv导出
喵手14 小时前
Python爬虫实战:电商实体消歧完整实战 - 从混乱店铺名到标准化知识库的工程化实现,一文带你搞定!
爬虫·python·算法·爬虫实战·零基础python爬虫教学·同名实体消除·从混乱店铺名到标准化知识库
aluluka14 小时前
Emacs折腾日记(三十六)——打造个人笔记系统
笔记·python·emacs
黎子越14 小时前
python相关练习
java·前端·python
小白学大数据14 小时前
实测数据:多进程、多线程、异步协程爬虫速度对比
开发语言·爬虫·python·php
小鸡吃米…14 小时前
机器学习 - 精确率与召回率
人工智能·python·机器学习
sonrisa_15 小时前
Python同一类不同方法中变量值的传递
开发语言·windows·python
逻极15 小时前
OpenClaw「Clawdbot/Moltbot」 深入解析:核心架构深度剖析
python·ai·架构·agent·ai编程·moltbot·openclaw