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 模块
- 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"})
- 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()'))
- 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()'))
- 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()'))
- 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()'))
- etree.parse(source, parser=None, base_url=None) 将XML、HTML字符串解析为ElementTree对象
四、element 对象
- element.xpath(path) 执行xpath语法
- element.nsmap:获取或设置元素命名空间映射
- element.attrib:获取或设置元素属性
- element.text:获取或设置文本
- element.tag:返回对象名称
- element.append(element) 向节点里面追加子节点
- 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()'))
- element.find(xpath): 在元素的子树中查找与XPath表达式匹配的第一个元素,并返回该元素。如果找不到匹配的元素,则返回None
- element.findall(xpath): 在元素的子树中查找与XPath表达式匹配的所有元素,并返回一个列表
- element.get(attribute_name, default=None): 获取元素的指定属性的值
- element.set(attribute_name, value): 设置元素的指定属性的值
- element.iter(tag=None): 迭代元素及其子元素,可选择指定标签进行过滤
- element.getparent(): 获取元素的父元素
- element.getchildren(): 获取元素的所有子元素
- element.getroottree(): 获取包含元素的根元素的Tree对象
五、elementTree 对象
- elementTree.root: 根元素的Element对象。可以通过访问tree.root来获取根元素。
- elementTree.getroot(): 获取根元素的Element对象。与tree.root属性相同,用于获取根元素
- elementTree.find(path): 在整个文档中查找具有指定路径的第一个元素,并返回该元素的Element对象。路径可以使用XPath表达式指定
- elementTree.findall(path): 在整个文档中查找具有指定路径的所有元素,并返回这些元素的列表。路径可以使用XPath表达式指定
- elementTree.iterfind(path): 在整个文档中迭代查找具有指定路径的元素,并返回这些元素的迭代器。路径可以使用XPath表达式指定
- elementTree.write(file, encoding=None, xml_declaration=None, pretty_print=False): 将整个文档写入文件。file参数可以是文件名或文件对象。encoding参数指定写入文件时使用的字符编码。xml_declaration参数指定是否写入XML声明。pretty_print参数指定是否以更易读的格式写入文档
- elementTree.tostring(element, encoding=None, method=“xml”, pretty_print=False): 将指定元素及其子元素序列化为字符串。element参数是要序列化的元素。encoding参数指定字符串的字符编码。method参数指定序列化的方法,可以是"xml"(默认)或"html"。pretty_print参数指定是否以更易读的格式序列化。
- elementTree.parse(source, parser=None, base_url=None): 静态方法,用于解析XML或HTML文档并返回一个ElementTree对象。与etree.parse函数的用法相同
六、parse 解析器对象
- lxml.etree.XMLParser: 用于解析XML文档的默认解析器。它支持标准的XML解析,并提供了丰富的功能和选项,如命名空间支持、DTD验证等。
- lxml.etree.HTMLParser: 用于解析HTML文档的默认解析器。它专门针对HTML进行了优化,并具有处理HTML特性的功能,如自动修复破碎的标签、处理实体引用等。
- lxml.etree.XMLPullParser: 一种事件驱动的解析器,用于逐行解析XML文档。它提供了一个迭代器接口,可以逐行读取和处理XML文档。
- lxml.etree.HTMLPullParser: 一种事件驱动的解析器,用于逐行解析HTML文档。它提供了一个迭代器接口,可以逐行读取和处理HTML文档。