2013-03-02 48 views
1

我想用xml.etree.ElementTree解析Python 3中的XHTML文檔。該文檔包含 實體,所以我不能使用默認的解析器設置。我想要做類似的東西:使用xml.etree.ElementTree解析XHTML

with urllib.request.urlopen(BASE_URL) as url: 
     body = url.read() 
     parser = ET.XMLParser() 
     parser.parser.UseForeignDTD(True) 
     parser.entity.update(entitydefs) 
     etree = ET.ElementTree() 
     root = etree.fromstring(body) 

fromstringElementTree免費的功能。我怎樣才能實現類似ElementTree實例?

回答

1

嗯,我遇到了同樣的問題。問題中的示例代碼和所選的答案可能在之前有效,但現在它不適用於我的Python 3.3和Python 3.4環境。

我終於搞定了。引自此Q&A

this post的啓發,我們可以將一些XML定義添加到傳入的原始HTML內容中,然後ElementTree將開箱即用。

這適用於Python 2.6,2.7,3.3,3.4。

import xml.etree.ElementTree as ET 

html = '''<html> 
    <div>Some reasonably well-formed HTML content.</div> 
    <form action="login"> 
    <input name="foo" value="bar"/> 
    <input name="username"/><input name="password"/> 

    <div>It is not unusual to see &nbsp; in an HTML page.</div> 

    </form></html>''' 

magic = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [ 
      <!ENTITY nbsp ' '> 
      ]>''' # You can define more entities here, if needed 

et = ET.fromstring(magic + html) 
2

飼料解析器:

with urllib.request.urlopen(BASE_URL) as url: 
    body = url.read() 
    parser = ET.XMLParser() 
    parser.parser.UseForeignDTD(True) 
    parser.entity.update(entitydefs) 
    parser.feed(body) 
    root = parser.close() # this returns you the tree 
+0

樓主問的Python 3解決方案,但是'parser.parser.UseForeignDTD(真)'不會在Python 3下工作如何走到這一步的答案被選爲正確的答案? – RayLuo 2016-02-02 11:50:22