当尝试从本地加载的文件中解析(从Python
中找到一个元素时),使用BeautifulSoup
的{{1}}脚本获取None
:
XML
文件:
xmlData = None
with open('conf//test2.xml', 'r') as xmlFile:
xmlData = xmlFile.read()
# this creates a soup object out of xmlData,
# which is properly loaded from file above
xmlSoup = BeautifulSoup(xmlData, "html.parser")
# this resolves to None
subElemX = xmlSoup.root.singleelement.find('subElementX', recursive=False)
我还有一个返回相同XML的REST GET服务,但是当我使用requests.get
读取它时,它被解析得很好:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<singleElement>
<subElementX>XYZ</subElementX>
</singleElement>
<repeatingElement id="1"/>
<repeatingElement id="2"/>
</root>
为什么它与REST响应一起使用而不是从本地文件中读取数据?
更新虽然我了解python是区分大小写的并且单个 e lement!=单个 E lement,但在解析时会忽略该大小写网络服务。
答案 0 :(得分:2)
使它成功的两件事:
html.parser
更改为xml
(您正在解析XML数据,XML!= HTML)singleelement
更改为singleElement
应用的更改(适合我):
xmlSoup = BeautifulSoup(xmlData, "xml")
subElemX = xmlSoup.root.singleElement.find('subElementX', recursive=False)
print(subElemX) # prints <subElementX>XYZ</subElementX>
答案 1 :(得分:1)
显然,HTML是一种不区分大小写的语言,因此html.parser
在内部将所有标记名称转换为小写。鉴于此,以下行应该有效:
subElemX = xmlSoup.root.singleelement.find('subelementx', recursive=False)
但总的来说,您不应该使用HTML解析器解析XML文档。 XML对其语法非常严格,这是有充分理由的。