簡體   English   中英

使用 BeautifulSoup 填充(並識別)空的 xml 標簽

[英]Using BeautifulSoup to populate (and identify) empty xml tags

填充空的 XML 標記似乎不是我可以輕易找到的可用解決方案。

假設我們收到一個如下所示的 XML 片段,其中包含客戶的信息:

<TransactionDetails>
    <Name>Jamie Silver</Name>
    <CustomerID>1234567</CustomerID>
    <StaffID>9876543</StaffID>
</TransactionDetails>

有時,我們收到的片段可能沒有為其提供服務的人員的 StaffID。 在這種情況下,XML 片段以非常不同的方式顯示StaffID標記:

<TransactionDetails>
    <Name>Jamie Silver</Name>
    <CustomerID>1234567</CustomerID>
    <StaffID/>
</TransactionDetails>

因此,當 StaffID 丟失時會發生什么情況是<StaffID></StaffID>被截斷為<StaffID/> ,其中正斜杠移到后面。

我想要做的是使用 BeautifulSoup 將填充的值插入到 XML 文件中,但它還需要修復不正確的截斷(以便<StaffID/>首先變回<StaffID></StaffID>

CSS 選擇器通常與 HTML 一起使用,但許多選擇器與 XML 一起使用也很好。 由於您使用的是 XML,我們將使用lxml-xml解析器。 我們將使用:empty選擇器。 只要元素沒有子元素並且只包含空格,這對我們有用。 這是使用:empty的 css-selector-4 定義: https : //drafts.c​​sswg.org/selectors-4/#the-empty-pseudo

下面的示例針對空的StaffID 然后我們用0000000替換那里的.string 因為空元素只有一個實例,所以只有那個會改變。

from bs4 import BeautifulSoup

XML = """
<root>
<TransactionDetails>
    <Name>Jamie Silver</Name>
    <CustomerID>1234567</CustomerID>
    <StaffID/>
</TransactionDetails>
<TransactionDetails>
    <Name>Jamie Silver</Name>
    <CustomerID>1234567</CustomerID>
    <StaffID>9876543</StaffID>
</TransactionDetails>
</root>
"""

soup = BeautifulSoup (XML, 'lxml-xml')
els = soup.select('StaffID:empty')

for el in els:
    el.string = "0000000"

print(soup)

輸出:

<?xml version="1.0" encoding="utf-8"?>                                                                                                                      
<root>                                                                                                                                                      
<TransactionDetails>                                                                                                                                        
<Name>Jamie Silver</Name>                                                                                                                                   
<CustomerID>1234567</CustomerID>                                                                                                                            
<StaffID>0000000</StaffID>                                                                                                                                  
</TransactionDetails>                                                                                                                                       
<TransactionDetails>                                                                                                                                        
<Name>Jamie Silver</Name>                                                                                                                                   
<CustomerID>1234567</CustomerID>                                                                                                                            
<StaffID>9876543</StaffID>                                                                                                                                  
</TransactionDetails>                                                                                                                                       
</root>

希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM