XML标签文本提取问题:如何获取含嵌套标签的全部文本?
嘿,我懂你遇到的这个问题——提取XML里的article-id、article-title、abstract和keywords字段时,单标签的普通文本能正常提取,但碰到像<italic>嵌套在<article-title>里的情况,就只能拿到OrderedDict,没法得到完整的合并文本对吧?这其实是因为不少基础XML解析工具会把嵌套标签转成字典结构,咱们换用专门处理文本提取的工具就能完美解决!下面给你两种实用的Python方案:
BeautifulSoup是处理HTML/XML文本提取的利器,它能自动把嵌套标签里的所有文本合并成一个字符串,完全不会出现字典结构的问题。
首先安装依赖:
pip install beautifulsoup4 lxml
然后是具体代码:
from bs4 import BeautifulSoup from collections import OrderedDict def extract_xml_fields(xml_content): # 用lxml-xml解析器加载XML内容 soup = BeautifulSoup(xml_content, 'lxml-xml') result = OrderedDict() # 提取article-id article_id_tag = soup.find('article-id') if article_id_tag: result['article-id'] = article_id_tag.get_text(strip=True) # 提取article-title(自动合并嵌套标签文本) article_title_tag = soup.find('article-title') if article_title_tag: result['article-title'] = article_title_tag.get_text(strip=True) # 提取abstract abstract_tag = soup.find('abstract') if abstract_tag: result['abstract'] = abstract_tag.get_text(strip=True) # 提取keywords(处理多个<keyword>标签的情况) keyword_tags = soup.find_all('keyword') if keyword_tags: result['keywords'] = [tag.get_text(strip=True) for tag in keyword_tags] return result # 测试用的示例XML sample_xml = """ <root> <article-id>ART-2024-001</article-id> <title-group> <article-title> Acetylcholinesterase-Inhibiting Activity of Pyrrole Derivatives from a Novel Marine Gliding Bacterium, <italic>Rapidithrix thailandica</italic> </article-title> </title-group> <abstract> This study investigates the <bold>acetylcholinesterase-inhibiting activity</bold> of pyrrole derivatives isolated from <italic>Rapidithrix thailandica</italic>, a newly discovered marine gliding bacterium. </abstract> <kwd-group> <keyword>Marine Bacteria</keyword> <keyword>Acetylcholinesterase Inhibitor</keyword> <keyword>Pyrrole Derivatives</keyword> </kwd-group> </root> """ # 调用函数并查看结果 extracted_data = extract_xml_fields(sample_xml) print(extracted_data)
这里的核心是get_text(strip=True)方法——它会遍历目标标签下的所有子节点,把所有文本内容合并成一个字符串,同时自动去除多余的空格和换行,完美解决嵌套标签的文本提取问题。
如果你更习惯用lxml处理XML,也可以用XPath的string()函数来提取节点下的全部文本内容,包括嵌套子标签的文本。
先安装lxml:
pip install lxml
代码示例:
from lxml import etree from collections import OrderedDict def extract_xml_with_lxml(xml_content): # 解析XML内容 root = etree.fromstring(xml_content.encode('utf-8')) result = OrderedDict() # 提取article-id article_id = root.xpath('//article-id/text()') if article_id: result['article-id'] = article_id[0].strip() # 提取article-title,用string()获取所有嵌套文本 article_title = root.xpath('string(//article-title)') if article_title: result['article-title'] = article_title.strip() # 提取abstract abstract = root.xpath('string(//abstract)') if abstract: result['abstract'] = abstract.strip() # 提取keywords keywords = root.xpath('//keyword/text()') if keywords: result['keywords'] = [kw.strip() for kw in keywords] return result # 用同样的sample_xml测试 extracted_data = extract_xml_with_lxml(sample_xml) print(extracted_data)
XPath的string(//article-title)会直接返回<article-title>标签下的所有文本内容,不管里面有多少嵌套标签,输出的就是一个完整的字符串,不会出现OrderedDict的问题。
为什么之前会得到OrderedDict?
大概率是你用了xmltodict这类工具——它的核心功能是把XML转换成字典结构,所以遇到嵌套标签时,就会把内层标签转成字典的子项,最终返回OrderedDict。而上面两种方案都是专门针对文本提取优化的,完全避开了这个问题。
内容的提问来源于stack exchange,提问作者amol




