使用lxml读取XML时,如何获取元素下的全部子元素内容?
解决lxml获取XML元素下所有子元素内容的问题
你遇到的核心问题有两个:一是find()方法只会返回第一个匹配的元素,二是混淆了lxml和其他库的方法名(findAll是BeautifulSoup的方法,lxml里对应的是findall())。下面是完整的解决方案:
步骤1:正确获取所有子元素
要获取某个节点下的所有匹配子元素,使用lxml Element对象的findall()方法(注意是小写开头+all),然后遍历这些元素并拼接内容。针对你的XML结构,示例代码如下:
from lxml import etree as ET tree = ET.parse('data/data.xml') root = tree.getroot() records = tree.findall('record') for record in records: # 处理NAME字段:获取所有P元素并拼接文本 name_elements = record.findall("NAME/P") full_name = "\n".join([elem.text.strip() for elem in name_elements if elem.text]) # 处理ADDRESS字段 address_elements = record.findall("ADDRESS/P") full_address = "\n".join([elem.text.strip() for elem in address_elements if elem.text]) # 处理SUBJECT字段 subject_elements = record.findall("SUBJECT/P") full_subject = "\n".join([elem.text.strip() for elem in subject_elements if elem.text]) # 处理QUERYS字段 querys_elements = record.findall("QUERYS/P") full_querys = "\n".join([elem.text.strip() for elem in querys_elements if elem.text]) # 打印测试结果 print("NAME内容:\n", full_name) print("ADDRESS内容:\n", full_address) print("SUBJECT内容:\n", full_subject) print("QUERYS内容:\n", full_querys) # 后续插入MySQL的逻辑(示例) # 假设你已经建立了数据库连接和cursor # cursor.execute( # "INSERT INTO your_table (NAME, ADDRESS, SUBJECT, QUERYS) VALUES (%s, %s, %s, %s)", # (full_name, full_address, full_subject, full_querys) # ) # conn.commit()
关键说明
find()vsfindall():find()仅返回第一个匹配的元素,而findall()会返回所有匹配的元素列表,这就是你之前只拿到第一个P内容的原因。- 方法名注意:lxml中是
findall()(全小写),而findAll()是BeautifulSoup库的方法,所以你之前调用record.findAll会提示方法不存在。 - 文本处理:用
join()拼接所有P元素的文本,同时用strip()去除多余的空格,if elem.text避免处理没有文本的空元素。
运行这段代码后,你就能获取每个字段下的全部子元素内容,之后就可以将这些变量插入到MySQL对应的字段中了。
内容的提问来源于stack exchange,提问作者Kioko Kiaza
相关产品推荐
相关产品推荐

