使用Python XML findall提取段落未获取全部内容的问题排查
问题分析与解决
你的代码存在三个核心问题,导致无法正确获取全部段落:
1. 变量名不匹配
循环中定义的变量是nameoffile,但后续判断文件后缀、解析文件时误用了未定义的filename,这会直接触发NameError,根本无法正常处理文件。
2. XPath路径范围过窄
./body/sec/p只能匹配直接嵌套在<body>下的<sec>标签内的<p>标签,如果XML结构里存在嵌套的<sec>(比如<sec>内部再包含<sec>),内层<sec>里的<p>会被完全遗漏。应该使用递归匹配的XPath表达式//body//p,它能找到<body>节点下所有层级的<p>标签。
3. 仅提取首个文本节点
x.text只能获取<p>标签起始位置的文本,一旦<p>内部包含其他子标签(比如示例里的<xref>),子标签之后的文本会丢失。需要用itertext()方法遍历<p>下所有文本节点并拼接,才能得到完整段落内容。
修正后的代码
import os import xml.etree.ElementTree as ET words_input_dir = "你的目标目录路径" # 替换为实际目录路径 for nameoffile in os.listdir(words_input_dir): if nameoffile.endswith(".xml"): # 拼接完整文件路径,避免相对路径问题 file_path = os.path.join(words_input_dir, nameoffile) tree = ET.parse(file_path) root = tree.getroot() # 递归获取body下所有层级的p标签 all_paragraphs = root.findall("//body//p") for para in all_paragraphs: # 拼接所有文本节点,得到完整段落 full_text = ''.join(para.itertext()).strip() print(full_text)
内容的提问来源于stack exchange,提问作者Idkwhatywantmed
相关产品推荐
相关产品推荐

