You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

XML标签文本提取问题:如何获取含嵌套标签的全部文本?

嘿,我懂你遇到的这个问题——提取XML里的article-idarticle-titleabstractkeywords字段时,单标签的普通文本能正常提取,但碰到像<italic>嵌套在<article-title>里的情况,就只能拿到OrderedDict,没法得到完整的合并文本对吧?这其实是因为不少基础XML解析工具会把嵌套标签转成字典结构,咱们换用专门处理文本提取的工具就能完美解决!下面给你两种实用的Python方案:

方案一:用BeautifulSoup提取完整文本

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的XPath提取文本

如果你更习惯用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

火山引擎 最新活动