首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中查找XML文件的特定部分时出现问题

在Python中查找XML文件的特定部分时出现问题
EN

Stack Overflow用户
提问于 2021-11-17 10:28:45
回答 2查看 65关注 0票数 0

我正在处理XML文件,我希望能够访问这个文件的作者id和文本。我实现了以下代码,但不确定某些行。

代码语言:javascript
运行
复制
for filepath in dataset_filepaths:

  with open(filepath) as f:
    soup = BeautifulSoup(f, "lxml")
  body = soup.body

  # To choose the author id !!! Is not working
  author = body.select('author_id')[0].get_text().strip()

  # To choose the text 
  soup_text = body.select('div')[0]

我有以下问题

  1. 如何选择作者id?
  2. 来选择文本应该使用'div‘还是’ab‘?
  3. 如何选择文本的标题?

非常感谢你的帮助!

这是你的文本

代码语言:javascript
运行
复制
<div author_id="0093" work_id="006" work_short="Metaph">
<ab l0="0093" l1="006" l2="Metaph" l8="4a" l9="1t">
<lb n="1t"/>
<title>ΘΕΟΦΡΑΣΤΟΥ ΤΩΝ ΜΕΤΑ ΤΑ ΦΥΣΙΚΑ</title>
<lb n="2"/>
Πῶσ ἀφορίσαι δεῖ καὶ ποίοισ τὴν ὑπὲρ τῶν
<lb n="3"/>
πρώτων θεωρίαν; ἡ γὰρ δὴ τῆσ φύσεωσ πολυ‐
<lb n="4"/>
χουστέρα, καὶ ὥσ γε δή τινέσ φασιν, ἀτακτοτέρα,
<lb n="5"/>

下面是一个有效的XML

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<div author_id="0093" work_id="006" work_short="Metaph">
   <ab l0="0093" l1="006" l2="Metaph" l8="4a" l9="1t">
      <lb n="1t" />
      <title>ΘΕΟΦΡΑΣΤΟΥ ΤΩΝ ΜΕΤΑ ΤΑ ΦΥΣΙΚΑ</title>
      <lb n="2" />
      Πῶσ ἀφορίσαι δεῖ καὶ ποίοισ τὴν ὑπὲρ τῶν
      <lb n="3" />
      πρώτων θεωρίαν; ἡ γὰρ δὴ τῆσ φύσεωσ πολυ‐
      <lb n="4" />
      χουστέρα, καὶ ὥσ γε δή τινέσ φασιν, ἀτακτοτέρα,
      <lb n="5" />
   </ab>
</div>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-17 12:55:08

你可以这样做。

  • ,因为您需要author_id,所以选择<div>。由于author_id是标记的属性,所以可以这样提取它

D= soup.find('div') author_id =d‘’author_id‘

  • 作为标题,选择使用.find()<title>标记并打印它的文本

代码语言:javascript
运行
复制
from bs4 import BeautifulSoup

s = """<?xml version="1.0" encoding="UTF-8"?>
<div author_id="0093" work_id="006" work_short="Metaph">
   <ab l0="0093" l1="006" l2="Metaph" l8="4a" l9="1t">
      <lb n="1t" />
      <title>ΘΕΟΦΡΑΣΤΟΥ ΤΩΝ ΜΕΤΑ ΤΑ ΦΥΣΙΚΑ</title>
      <lb n="2" />
      Πῶσ ἀφορίσαι δεῖ καὶ ποίοισ τὴν ὑπὲρ τῶν
      <lb n="3" />
      πρώτων θεωρίαν; ἡ γὰρ δὴ τῆσ φύσεωσ πολυ‐
      <lb n="4" />
      χουστέρα, καὶ ὥσ γε δή τινέσ φασιν, ἀτακτοτέρα,
      <lb n="5" />
   </ab>
</div>"""

soup = BeautifulSoup(s, 'xml')
d = soup.find('div')
author_id = d['author_id']
title = d.find('title').text

txt = ' '.join(list(d.ab.stripped_strings)[1:])

print(f'Author_ID: {author_id}\nTitle: {title}\nText: {txt}')
代码语言:javascript
运行
复制
Author_ID: 0093
Title: ΘΕΟΦΡΑΣΤΟΥ ΤΩΝ ΜΕΤΑ ΤΑ ΦΥΣΙΚΑ
Text: Πῶσ ἀφορίσαι δεῖ καὶ ποίοισ τὴν ὑπὲρ τῶν πρώτων θεωρίαν; ἡ γὰρ δὴ τῆσ φύσεωσ πολυ‐ χουστέρα, καὶ ὥσ γε δή τινέσ φασιν, ἀτακτοτέρα,
票数 1
EN

Stack Overflow用户

发布于 2021-11-17 11:37:21

如下所示

代码语言:javascript
运行
复制
from bs4 import BeautifulSoup
from bs4.element import NavigableString

html = '''<div author_id="0093" work_id="006" work_short="Metaph">
<ab l0="0093" l1="006" l2="Metaph" l8="4a" l9="1t">
<lb n="1t"/>
<title>ΘΕΟΦΡΑΣΤΟΥ ΤΩΝ ΜΕΤΑ ΤΑ ΦΥΣΙΚΑ</title>
<lb n="2"/>
Πῶσ ἀφορίσαι δεῖ καὶ ποίοισ τὴν ὑπὲρ τῶν
<lb n="3"/>
πρώτων θεωρίαν; ἡ γὰρ δὴ τῆσ φύσεωσ πολυ‐
<lb n="4"/>
χουστέρα, καὶ ὥσ γε δή τινέσ φασιν, ἀτακτοτέρα,
<lb n="5"/>'''
soup = BeautifulSoup(html, 'html.parser')

author_id = soup.div.attrs['author_id']
print('------------------')
print(f'author_id: {author_id}')
print('------------------')
title = soup.div.title.text
print(f'title: {title}')
print('------------------')
text = []
for child in soup.div.ab.children:
    if isinstance(child,NavigableString):
      if child.text.strip():
        text.append(child.text.strip())
print(f'text: {text}')  

输出

代码语言:javascript
运行
复制
------------------
author_id: 0093
------------------
title: ΘΕΟΦΡΑΣΤΟΥ ΤΩΝ ΜΕΤΑ ΤΑ ΦΥΣΙΚΑ
------------------
text: ['Πῶσ ἀφορίσαι δεῖ καὶ ποίοισ τὴν ὑπὲρ τῶν', 'πρώτων θεωρίαν; ἡ γὰρ δὴ τῆσ φύσεωσ πολυ‐', 'χουστέρα, καὶ ὥσ γε δή τινέσ φασιν, ἀτακτοτέρα,']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70002688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档