代码之家  ›  专栏  ›  技术社区  ›  Jeff R

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

  •  0
  • Jeff R  · 技术社区  · 3 年前

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

    <?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提取以下字段 <dc.title> .我很难只提取ISBN字段( <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的长度也可能不同。

    1 回复  |  直到 3 年前
        1
  •  0
  •   RQussous    3 年前

    根据文档,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