[英]Identify and replace elements of XML using BeautifulSoup in Python
[英]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.csswg.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.