2016-11-16 120 views
1

Python腳本利用BeautifulSoup試圖解析從本地加載的文件(找到一個元素)XML時得到NoneBeautifulSoup不解析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 version="1.0" encoding="UTF-8" standalone="yes"?> 
<root> 
    <singleElement> 
     <subElementX>XYZ</subElementX> 
    </singleElement> 
    <repeatingElement id="1"/> 
    <repeatingElement id="2"/> 
</root> 

我也有返回相同的XML格式的REST GET服務,但是當我讀到使用requests.get,它是精細解析:

resp = requests.get(serviceURL, headers=headers) 

respXML = resp.content.decode("utf-8") 

restSoup = BeautifulSoup(respXML, "html.parser") 

它爲什麼與REST響應一起工作,而不與從本地文件讀出的數據一起工作?

UPDATE:雖然我明白,蟒蛇是區分大小寫和單Ë字元素=單Ë字元素,案件正在解析Web服務時不予考慮。

+0

print'xmlData'和'respXML'並比較你得到的結果。 – furas

+0

'singleelement!= singleElement' – njzk2

+0

有趣,它適用於REST服務 – amphibient

回答

2

兩件事情,使其工作:

  • 變化從html.parser功能來xml(!你解析XML數據,XML = HTML)
  • 變化singleelementsingleElement

變化應用(適用於我):

xmlSoup = BeautifulSoup(xmlData, "xml") 

subElemX = xmlSoup.root.singleElement.find('subElementX', recursive=False) 
print(subElemX) # prints <subElementX>XYZ</subElementX> 
+0

我得到了'bs4.FeatureNotFound:無法找到具有您請求的功能的樹生成器:xml。你需要安裝一個解析器庫嗎?' – amphibient

+0

@amphibient啊,是的,你需要安裝'lxml'才能工作。 – alecxe

+0

我試過'python -m pip install lxml',但得到了'ERROR:b''xslt-config'不被識別爲內部或外部命令,\ r \ noperable program' – amphibient

1

顯然,HTML是不區分大小寫的語言,因此html.parser將所有標記名稱內部轉換爲小寫。鑑於此,以下行應起作用:

subElemX = xmlSoup.root.singleelement.find('subelementx', recursive=False) 

但是,通常情況下,您不應該使用HTML解析器解析XML文檔。 XML對其語法非常嚴格,這是一個很好的理由。