2016-03-22 8 views
1

Die folgende (von "Tauchen Sie ein in Python")robust DOM mit getElementsByTagName Parsen

from xml.dom import minidom 
xmldoc = minidom.parse('/path/to/index.html') 
reflist = xmldoc.getElementsByTagName('img') 

fehlgeschlagen mit

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/path/to/htmlToNumEmbedded.py", line 2, in <module> 
    xmldoc = minidom.parse('/path/to/index.html') 
    File "/usr/lib/python2.7/xml/dom/minidom.py", line 1918, in parse 
    return expatbuilder.parse(file) 
    File "/usr/lib/python2.7/xml/dom/expatbuilder.py", line 924, in parse 
    result = builder.parseFile(fp) 
    File "/usr/lib/python2.7/xml/dom/expatbuilder.py", line 207, in parseFile 
    parser.Parse(buffer, 0) 
xml.parsers.expat.ExpatError: mismatched tag: line 12, column 4 

Mit lxml, die von http://www.ianbicking.org/blog/2008/12/lxml-an-underappreciated-web-scraping-library.html empfohlen wird, können Sie das Dokument analysieren, aber es scheint kein getElementsByTagName zu haben. Die folgenden Werke:

from lxml import html 
xmldoc = html.parse('/path/to/index.html') 
root = xmldoc.getroot() 
for i in root.iter("img"): 
    print i 

aber scheint kludgey: Gibt es eine eingebaute Funktion, die ich übersehen?

Oder eine andere elegantere Art zu haben robustes DOM-Parsing mit getElementsByTagName?

Antwort

1

Siehe Wenn Sie eine Liste von Element möchten, anstatt den Rückgabewert der Element.iter Iterieren, rufen list darauf:

from lxml import html 
reflist = list(html.parse('/path/to/index.html.html').iter('img')) 
0

können Sie BeautifulSoup für diesen Einsatz:

from bs4 import BeautifulSoup 

with open('/path/to/index.html') as f: 
    soup = BeautifulSoup(f) 
soup.find_all("img") 

Going through HTML DOM in Python