BeautifulSoup不解析从本地文件加载的XML

时间:2016-11-16 18:07:59

标签: python xml beautifulsoup

当尝试从本地加载的文件中解析(从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,但在解析时会忽略该大小写网络服务。

2 个答案:

答案 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对其语法非常严格,这是有充分理由的。