2016-11-16 5 views
1

解析し、ローカルにロードされたファイルからXMLを(から要素を見つける。)しようとしたときBeautifulSoupNoneを取得し利用マイPythonスクリプト:BeautifulSoupは、ローカルファイルからロードされた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:私はPythonは大文字と小文字を区別し、単一電子 lementであることを理解している間=単一E lement Webサービスを解析するとき、ケースを無視しています!。

+0

'xmlData'と' respXML'を出力して、あなたが得るものを比較してください。 – furas

+0

'singleelement!= singleElement' – njzk2

+0

面白いですが、これはRESTサービスで動作します – amphibient

答えて

2

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はその構文に関して非常に厳格ですが、それは正当な理由によるものです。

関連する問題