2010-03-07 6 views
10

Ich versuche gerade, eine Website zu kratzen, die ziemlich schlecht formatiert HTML hat (häufig fehlende schließende Tags, keine Verwendung von Klassen oder IDs, so dass es unglaublich schwierig ist, direkt zu dem Element zu gehen, etc.)). Ich habe BeautifulSoup bisher mit einigem Erfolg benutzt, aber hin und wieder (obwohl ziemlich selten) stoße ich auf eine Seite, auf der BeautifulSoup den HTML-Baum ein wenig anders als zB Firefox oder Webkit erstellt. Während dies verständlich ist, da die Formatierung des HTML dies mehrdeutig macht, wenn ich in der Lage wäre, den gleichen Syntaxbaum zu erhalten, wie Firefox oder Webkit produziert, wäre ich in der Lage, die Dinge viel einfacher zu parsen. Die Probleme sind in der Regel etwas wie die Website öffnet ein <b> Tag zweimal und wenn BeautifulSoup das zweite <b> Tag sieht, schließt es sofort die erste, während Firefox und Webkit die <b> Tags verschachteln.Web Scraping mit Python

Gibt es eine Web-Scraping-Bibliothek für Python (oder irgendeine andere Sprache (ich bin verzweifelt)), die den von Firefox oder WebKit generierten Parse-Baum reproduzieren kann (oder zumindest bei Unklarheiten näher kommt als BeautifulSoup) .

+0

Warum nicht verwenden Webkit selbst? Webkit ist Open Source. Ja, es wird etwas Zeit brauchen, um sich daran zu gewöhnen. –

+1

Hast du der schönen Gruppe erzählt? Sie sind wahrscheinlich an einem Fall wie dem Ihren interessiert http://groups.google.com/group/beautifulsoup –

+0

So oft gefragt ... –

Antwort

10

Verwenden BeautifulSoup als Baumbauer für html5lib:

from html5lib import HTMLParser, treebuilders 

parser = HTMLParser(tree=treebuilders.getTreeBuilder("beautifulsoup")) 

text = "a<b>b<b>c" 
soup = parser.parse(text) 
print soup.prettify() 

Ausgang:

<html> 
<head> 
</head> 
<body> 
    a 
    <b> 
    b 
    <b> 
    c 
    </b> 
    </b> 
</body> 
</html> 
1

Nun, WebKit ist Open Source, so dass Sie einen eigenen Parser (in der WebCore Komponente) verwenden könnte, wenn eine Sprache akzeptabel ist

2

Sie einen Browser Ihrer Wahl mit SeleniumRC fahren kann.

3

haben Sie versucht scrapy?

Scrapy ist ein schneller High-Level-Bildschirm Schaben und Web-Crawling-Rahmen, verwendet, um Websites zu kriechen und strukturierte Daten von ihren Seiten zu extrahieren. Es kann für eine breite Palette von Zwecke verwendet werden, von Data Mining bis Überwachung und automatisierte Tests.

0

Aus der Dokumentation scheint es, dass ICantBelieveItsBeautifulSoup Parser ist das, was Sie wollen:

ICantBelieveItsBeautifulSoup ist auch eine Unterklasse von BeautifulSoup. Es hat HTML Heuristiken, die näher an den HTML-Standard anpassen, aber ignorieren, wie HTML in der realen Welt verwendet wird. Für Beispiel ist es gültiges HTML zu nisten <B> Tags, aber in der realen Welt ein verschachtelter <B> Tag bedeutet fast immer, dass der Autor vergessen, den ersten <B> Tag zu schließen. Wenn Sie jemanden treffen, der tatsächlich Nester <B> Tags, dann können Sie ICantBelieveItsBeautifulSoup verwenden.

0

dieses mir gut aussieht ich es selbst bin mit: link [http://code.google.com/p/webscraping/]

1

Sie lxml Parser verwenden können, in der beautifulsoup und Wenn Sie xpath verwenden, um die Daten in einer nicht formatierten HTML-Seite zu finden, können Sie den xpath kopieren, wenn Sie das Element mithilfe von firebug untersuchen.

Sie können dieses Tutorial finden Sie unter: http://www.youtube.com/watch?v=PgWfF-Ut0zM