2010-11-06 7 views
15

Ich versuche, etwas HTML in Python zu analysieren. Es gab einige Methoden, die vorher wirklich funktionierten ... aber heutzutage kann ich nichts ohne Workarounds verwenden.Python HTML-Parsing, das tatsächlich funktioniert

  • beautifulsoup Probleme hat nach SGMLParser wegging
  • html5lib nicht von einem halben analysieren kann, was „da draußen“
  • lxml versucht, „zu korrigieren“ für typische HTML (Attribute und Tags werden nicht unbekannt Namespaces enthalten, oder eine Ausnahme wird ausgelöst, was bedeutet, dass fast keine Seite mit Facebook connect geparst werden kann.)

Welche anderen Optionen gibt es heutzutage? (Wenn sie Xpath unterstützen, wäre das großartig)

+0

Sie müssen Beispiele für Seiten angeben, auf denen Ihre aktuellen Ansätze fehlschlagen. Wie können wir sonst wissen, ob unsere vorgeschlagenen Lösungen Ihre Probleme lösen werden? Vergessen Sie auch nicht, die Fehler html5lib unter http://code.google.com/p/html5lib/issues/entry zu melden. –

Antwort

20

Stellen Sie sicher, dass Sie das html Modul verwenden, wenn Sie HTML parsen mit lxml:

>>> from lxml import html 
>>> doc = """<html> 
... <head> 
... <title> Meh 
... </head> 
... <body> 
... Look at this interesting use of <p> 
... rather than using <br /> tags as line breaks <p> 
... </body>""" 
>>> html.document_fromstring(doc) 
<Element html at ...> 

Alle Fehler & Ausnahmen schmelzen wird, werden Sie mit einem erstaunlich schnellen Parser überlassen werden, die oft beschäftigt sich mit HTML Suppe besser als BeautifulSoup.

+0

Das ist interessant. Ich habe lxml immer über einen Treebuilder verwendet. Ich war mir ziemlich sicher, dass HTMLParser diesen erzwungenen HTML-Modus verwendet hat. Scheinbar nicht. lxml.html analysiert das Zeug wie ' 'richtig. (wo lxml eine Exception geworfen hat) – viraptor

+0

Freut mich zu hören, dass die Dinge gut für Sie arbeiten! Danke, dass du die Antwort akzeptiert hast. –

+1

s/thinks/sachen –

1

Ich denke, das Problem ist, dass die meisten HTML schlecht formatiert ist. XHTML hat versucht, das zu beheben, aber es hat sich nie richtig durchgesetzt - besonders, da die meisten Browser "intelligente Workarounds" für schlecht formatierten Code verwenden.

Noch vor ein paar Jahren habe ich versucht, HTML für eine primitive Spider-App zu analysieren, und fand die Probleme zu schwierig. Ich vermute, dass es wahrscheinlich ist, dass Sie selbst schreiben, obwohl wir nicht die einzigen Leute mit diesem Problem sein können!

10

Ich habe pyparsing für eine Reihe von HTML-Seite Scraping-Projekte verwendet. Es ist eine Art Mittelweg zwischen BeautifulSoup und den vollständigen HTML-Parsern an einem Ende und dem zu niedrigen Ansatz von regulären Ausdrücken (auf diese Weise liegt der Wahnsinn).

Mit Pyparsen können Sie häufig gute HTML-Scraper-Ergebnisse erzielen, indem Sie die bestimmte Teilmenge der Seite oder Daten identifizieren, die Sie extrahieren möchten. Dieser Ansatz vermeidet die Probleme beim Versuch, alles auf der Seite zu analysieren, da einige problematische HTML außerhalb Ihrer Region von Interesse einen umfassenden HTML-Parser auslösen könnte.

Während dies klingt wie eine verherrlichte Regex-Ansatz, bietet Pyparsen Builtins für die Arbeit mit HTML-oder XML-Tagged Text. Pyparsing vermeidet viele der Gefahren, die die Regex-basierten Lösungen zu vereiteln: ohne Littering

  • akzeptiert Leerzeichen ‚\ s *‘ am ganzen Ausdruck
  • innerhalb unerwartete Eigenschaften Griffe Tags
  • Griffe Attribute in beliebiger Reihenfolge
  • Griffe Groß-/Kleinschreibung in Tags
  • Griffe Namen mit Namensraum
  • Griffe Attributwerte in doppelten Anführungszeichen, Apostrophe Attribut oder keine Zitate
  • leere Tags behandelt (die von der Form <blah />)
  • kehrt analysiert Tag-Daten mit dem Objekt-Attribute Zugriff auf Tag-Attribut

Hier ist ein einfaches Beispiel aus dem pyparsing Wiki, die <a href=xxx> Tags von einem bekommt Webseite:

from pyparsing import makeHTMLTags, SkipTo 

# read HTML from a web page 
page = urllib.urlopen("http://www.yahoo.com") 
htmlText = page.read() 
page.close() 

# define pyparsing expression to search for within HTML  
anchorStart,anchorEnd = makeHTMLTags("a") 
anchor = anchorStart + SkipTo(anchorEnd).setResultsName("body") + anchorEnd 

for tokens,start,end in anchor.scanString(htmlText): 
    print tokens.body,'->',tokens.href 

Dies wird die <a> Tags herausziehen, auch wenn es andere Teile der Seite problematisch HTML enthält.Es gibt auch andere HTML-Beispiele am pyparsing wiki:

Pyparsing ist jedoch keine absolute narrensicher Lösung für dieses Problem, aber durch die Belichtungs Englisch: www.doc-o-matic.com/webhelp/TdlgEditEdit.html Sie können besser analysieren, welche Teile des HTML - Dokuments Sie speziell interessieren, sie bearbeiten und überspringen sich ausruhen.

4

Wenn Sie Inhalte scrappen, ist eine hervorragende Möglichkeit, um irritierende Details zu umgehen, das sitescraper Paket. Es verwendet maschinelles Lernen, um zu bestimmen, welcher Inhalt für Sie abgerufen werden soll.

Von der Homepage:

>>> from sitescraper import sitescraper 
>>> ss = sitescraper() 
>>> url = 'http://www.amazon.com/s/ref=nb_ss_gw?url=search-alias%3Daps&field-keywords=python&x=0&y=0' 
>>> data = ["Amazon.com: python", 
      ["Learning Python, 3rd Edition", 
      "Programming in Python 3: A Complete Introduction to the Python Language (Developer's Library)", 
      "Python in a Nutshell, Second Edition (In a Nutshell (O'Reilly))"]] 
>>> ss.add(url, data) 
>>> # we can add multiple example cases, but this is a simple example so 1 will do (I generally use 3) 
>>> # ss.add(url2, data2) 
>>> ss.scrape('http://www.amazon.com/s/ref=nb_ss_gw?url=search-alias%3Daps&field- keywords=linux&x=0&y=0') 
["Amazon.com: linux", ["A Practical Guide to Linux(R) Commands, Editors, and Shell Programming", 
"Linux Pocket Guide", 
"Linux in a Nutshell (In a Nutshell (O'Reilly))", 
'Practical Guide to Ubuntu Linux (Versions 8.10 and 8.04), A (2nd Edition)', 
'Linux Bible, 2008 Edition: Boot up to Ubuntu, Fedora, KNOPPIX, Debian, openSUSE, and 11 Other Distributions']] 
5

html5lib kann nicht analysiert die Hälfte von dem, was "da draußen"

Die extrem unglaubwürdig klingt. html5lib verwendet genau den gleichen Algorithmus, der auch in den letzten Versionen von Firefox, Safari und Chrome implementiert wurde. Wenn dieser Algorithmus die Hälfte des Webs durchbricht, hätten wir wohl gehört. Wenn Sie besondere Probleme damit haben, melden Sie Fehler.

+0

Ok - vielleicht nicht die Hälfte, aber es hat einige Skript-Tags durchgebrannt (erinnere mich nicht an die Seite), vermisse einen großen Teil von youtube (manchmal) und andere Seiten, mit denen ich versucht habe, es zu benutzen. Ich werde Zeug berichten, das ich reproduzieren kann. – viraptor

+1

Script Tags sind in der Tat ein schreckliches Chaos, aber ihre Handhabung hat sich in letzter Zeit ziemlich verändert. Ich hoffe, Sie werden feststellen, dass es jetzt besser funktioniert. – Ms2ger

Verwandte Themen