[英]Finding namespace URIs for lxml
我正在使用 lxml 使用以下代碼解析 XML 產品提要:
namespace = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}
data = [loc.text for loc in tree.xpath("//sm:urlset/sm:url/sm:loc",namespaces=namespace)]
這適用於我用作輸入的大多數提要,但我偶爾會發現帶有其他命名空間的提要,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="https://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.sitemaps.org/schemas/sitemap/0.9
https://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<loc>https://www.example.com/</loc>
<priority>1.00</priority>
</url>
根據我的閱讀,我需要在此處添加額外的命名空間(我猜是 xmlns:xsi)到命名空間字典中,以使我的 xpath 能夠使用多個命名空間。 但是,這對我來說不是一個長期的解決方案,因為我將來可能會遇到其他不同的命名空間 - 有沒有辦法讓我搜索/檢測甚至刪除命名空間? 元素樹總是相同的,所以我的 xpath 不會改變。
謝謝
您不需要 map xsi
前綴; 這僅適用於xsi:schemaLocation
屬性。
您當前的映射和輸入文件之間的區別在於 XML 的默認命名空間中的“https”中有一個“s”。
要處理兩個命名空間 URI(或者實際上是urlset
可能具有的任何其他命名空間 URI),首先要獲取根元素的命名空間 URI,然后在 dict 映射中使用它......
from lxml import etree
tree = etree.parse("input.xml")
root_ns_uri = tree.xpath("namespace-uri()")
namespace = {"sm": root_ns_uri}
data = [loc.text for loc in tree.xpath("//sm:urlset/sm:url/sm:loc", namespaces=namespace)]
print(data)
印刷...
['https://www.example.com/']
如果urlset
並不總是根元素,您可能想要做這樣的事情......
root_ns_uri = tree.xpath("namespace-uri(//*[local-name()='urlset'])")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.