看看
import lxml.html, lxml.etree
url_cooking = 'http://cooking.stackexchange.com/feeds'
#lxml.etree version
data = lxml.etree.parse(url_cooking)
summary_nodes = data.xpath('.//feed/entry/summary')
print('Found ' + str(len(summary_nodes)) + ' summary nodes')
#lxml.html version
data = lxml.html.parse(url_cooking)
summary_nodes = data.xpath('.//feed/entry/summary')
print('Found ' + str(len(summary_nodes)) + ' summary nodes')
這兩個版本當你發現,第二個版本不返回任何節點,但lxml.html
版本工作正常。 etree
版本不起作用,因爲它期望名稱空間,並且html
版本正在工作,因爲它忽略了名稱空間。部分下降http://lxml.de/lxmlhtml.html,它說:「HTML解析器明顯忽略名稱空間和一些其他XMLisms。」
注意當您打印etree版本的根節點(print(data.getroot())
)時,您會得到類似於<Element {http://www.w3.org/2005/Atom}feed at 0x22d1620>
的內容。這意味着它是一個名稱空間爲http://www.w3.org/2005/Atom
的提要元素。這是一個糾正版的etree代碼。
import lxml.html, lxml.etree
url_cooking = 'http://cooking.stackexchange.com/feeds'
ns = 'http://www.w3.org/2005/Atom'
ns_map = {'ns': ns}
data = lxml.etree.parse(url_cooking)
summary_nodes = data.xpath('//ns:feed/ns:entry/ns:summary', namespaces=ns_map)
print('Found ' + str(len(summary_nodes)) + ' summary nodes')
'data.xpath( '// NS:進料/ NS:進入/ NS:摘要',命名空間= { '納秒':「HTTP: //www.w3.org/2005/Atom'})' – reclosedev 2012-02-23 08:46:31
gah,難怪!看起來像api在某個時候重命名了'namespaces'關鍵字。用工作代碼更新我的示例。 – gfortune 2012-02-23 09:05:55
非常感謝你的到來。在開始解析之前,我將開始檢查根目錄。 – MrCastro 2012-02-23 09:31:31