Python使用BeautifulSoup解析XML提取作者ID、文本与标题的相关问题
问题解决方法
你提供的代码首先存在两个基础逻辑错误:
- 解析XML时没有指定XML解析器,用了默认的HTML解析模式,会导致标签识别异常
- 错误套用HTML逻辑读取
soup.body,你的XML结构中不存在<body>标签,该变量为空,后续操作必然报错
以下是三个问题的具体解决方案:
1. 正确获取XML作者ID
你原来的代码错误将author_id当成了独立标签处理,实际上它是<div>标签的自定义属性,不能用select('author_id')获取。正确写法是先定位到根节点<div>,再读取对应属性值:
# 解析XML必须指定'lxml-xml'解析器 soup = BeautifulSoup(f, "lxml-xml") div_root = soup.find('div') author_id = div_root['author_id'].strip()
2. 提取文本内容的标签选择
应该选择<ab>标签提取文本内容:
<div>标签仅承载元数据属性,本身不包含直接的正文内容- 所有正文(包括标题、段落文本)都封装在
<ab>子标签内,提取时直接获取<ab>标签的文本内容即可,会自动过滤掉<lb>这类排版标签:
ab_node = div_root.find('ab') full_text = ab_node.get_text().strip()
3. 正确获取标题内容
标题是<ab>标签下的独立<title>子标签,直接定位后提取文本即可:
title = ab_node.find('title').get_text().strip()
修正后完整可运行代码
for filepath in dataset_filepaths: with open(filepath, 'r', encoding='utf-8') as f: # 解析XML必须指定lxml-xml解析器,避免HTML模式下标签识别错误 soup = BeautifulSoup(f, "lxml-xml") # 获取作者ID div_root = soup.find('div') author = div_root['author_id'].strip() # 获取内容承载节点ab ab_node = div_root.find('ab') # 获取标题 title = ab_node.find('title').get_text().strip() # 获取全文文本内容(自动过滤所有标签) full_content = ab_node.get_text().strip()
内容的提问来源于stack exchange,提问作者user16796049
相关产品推荐
相关产品推荐

