Spójrz na tych dwóch wersjach
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')
Jak odkryto, druga wersja zwraca żadnych węzłów, ale wersja lxml.html
działa dobrze. Wersja etree
nie działa, ponieważ oczekuje przestrzeni nazw i działa wersja html
, ponieważ ignoruje przestrzenie nazw. Po części w dół http://lxml.de/lxmlhtml.html, mówi: "Analizator składni HTML wyraźnie ignoruje przestrzenie nazw i niektóre inne XMLizmy."
Uwaga podczas drukowania węzła głównego wersji etree (print(data.getroot())
) otrzymuje się coś w rodzaju <Element {http://www.w3.org/2005/Atom}feed at 0x22d1620>
. Oznacza to, że jest to element kanału o przestrzeni nazw http://www.w3.org/2005/Atom
. Oto poprawiona wersja kodu 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: feed/NS: wejścia/ns: Podsumowanie', Przestrzenie nazw = { 'ns':„http: //www.w3.org/2005/Atom '}) ' – reclosedev
gah, nic dziwnego! Wygląda na to, że api zmieniło w pewnym momencie nazwę słowa kluczowego 'namespaces'. Aktualizacja mojej próbki za pomocą działającego kodu. – gfortune
dziękuję bardzo gfortune. Zacznę sprawdzać katalog główny, zanim przejdę do analizy. – MrCastro