使用 BeautifulSoup 从 python 中的 XML 中提取特定标签

Extracting specific tag from XML in python using BeautifulSoup

提问人:Jeff R 提问时间:9/20/2023 最后编辑:Jeff R 更新时间:9/20/2023 访问量:35

问:

我有一个元数据文件,如下所示:

<?xml version='1.0' encoding='utf-8'?>
<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="uuid_id" version="2.0">
    <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
        <dc:title>Princeton Review Digital SAT Premium Prep, 2024: 4 Practice Tests + Online Flashcards + Review &amp; Tools</dc:title>
        <dc:creator opf:file-as="Princeton Review, The" opf:role="aut">The Princeton Review</dc:creator>
        <dc:identifier opf:scheme="ISBN">9780593516874</dc:identifier>
        <dc:identifier opf:scheme="AMAZON">0593516877</dc:identifier>
        <dc:identifier opf:scheme="GOODREADS">63139948</dc:identifier>
        <dc:identifier opf:scheme="GOOGLE">o6i4EAAAQBAJ</dc:identifier>
    </metadata>
</package>

我知道如何使用 BeautifulSoup 来提取像 .我正在努力如何仅提取 ISBN 字段 ()。<dc.title><dc:identifier opf:scheme="ISBN">

from bs4 import BeautifulSoup

with open ('metadata.opf', 'r') as f:
    file = f.read()

metadata = BeautifulSoup(file, 'xml')
title = metadata.find('dc:title')
print(title.text)

author = metadata.find('dc:creator')
print(author.text)

# isbn = metadata.find_all('dc:identifier'). # This finds 4 fields, as expected.  

如何限制它?我不能依赖字段的顺序,并且 ISBN 长度可能会有所不同。

python xml 解析 beautifulsoup

评论

0赞 It_is_Chris 9/20/2023
metadata.find('dc:identifier')应该只找到第一个,这是您正在寻找的 ISBN,因为您正在打电话而不是问题是什么? 返回findfindAllmetadata.find('dc:identifier').text'9780593516874'
0赞 Jeff R 9/20/2023
我不知道 ISBN 在每种情况下都会排在第一位,所以我不能依赖它。(我有一个错别字,是 find_all() 返回 4 个字段。
0赞 It_is_Chris 9/20/2023
[data for data in metadata.findAll('dc:identifier') if data['opf:scheme'] == 'ISBN']
0赞 Jeff R 9/20/2023
我对 python 的了解不是很好,而且我不熟悉你使用的括号表示法。有没有链接可以解释它?谢谢!
0赞 It_is_Chris 9/21/2023
它是列表推导 - 即,一种遍历项目并创建列表而无需附加到空列表的方法

答:

0赞 RQussous 9/20/2023 #1

根据文档,find 方法有一个 argument 属性,使用它你应该能够选择 ISBN

isbn = metadata.find('dc:identifier', attrs={"opf:scheme": "ISBN"})

所以代码可以写成这样

from bs4 import BeautifulSoup

with open ('metadata.opf', 'r') as f:
    file = f.read()

metadata = BeautifulSoup(file, 'xml')
title = metadata.find('dc:title')
print(title.text)

author = metadata.find('dc:creator')
print(author.text)

isbn = metadata.find('dc:identifier', attrs={"opf:scheme": "ISBN"}) # This finds 4 fields, as expected. 
print(isbn.text) 

并应导致

Princeton Review Digital SAT Premium Prep, 2024: 4 Practice Tests + Online Flashcards + Review & Tools
The Princeton Review
9780593516874

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find