2009-05-02 19 views
1

Ich brauche etwas HTML-Parsing mit Python. Nach ein paar Recherchen scheint Lxml meine beste Wahl zu sein, aber es fällt mir schwer, Beispiele zu finden, die mir dabei helfen, was ich versuche zu tun. Deshalb höre ich. Ich muss eine Seite für alle seine sichtbaren Text schaben .. strip alle Tags und Javascript .. Ich brauche es, um mich mit dem Text sichtbar zu lassen. genug klingt einfach .. ich habe es mit dem HTMLParser aber es ist nicht javascript gut HandhabungPython Lxml Screen Scraping?

class HTML2Text(HTMLParser.HTMLParser): 
    def __init__(self): 
     HTMLParser.HTMLParser.__init__(self) 
     self.output = cStringIO.StringIO() 

    def get_text(self): 
     return self.output.getvalue() 

    def handle_data(self, data): 
     self.output.write(data) 

def ParseHTML(source): 
    p = HTML2Text() 
    p.feed(source) 
    text = p.get_text() 
    return text 

Irgendwelche Ideen für eine Art und Weise, dies zu tun mit lxml oder einen besseren Weg, es zu tun HTMLParser .. HTMLParser am besten sein würde, weil keine zusätzliche Bibliotheken benötigt wird .. dankt alle

Scott F.

Antwort

4

Keine Screen-scraping-Bibliothek I „tut gut mit Javascript“ wissen - es alle Möglichkeiten, einfach zu schwer zu antizipieren, in der JS den HTML-DOM verändern könnte dynamisch, bedingt & c.

0

Ich kenne keine Python-HTML-Parsing-Bibliotheken, die Javascript auf der zu analysierenden Seite ausführen. Es ist nicht einfach genug für die Gründe von Alex Martelli und mehr.

Für diese Aufgabe müssen Sie möglicherweise darüber nachdenken, auf eine höhere Ebene zu gehen, als HTML zu analysieren und Web-Anwendungstests zu betrachten.

Zwei, die Javascript und sind entweder Python basiert oder kann eine Schnittstelle mit Python ausführen kann: wenn die "Unit-Tests" Orientierung Ich bin nicht sicher

Leider Mit diesen Frameworks können Sie tatsächlich sichtbaren Text auskratzen.

Also die einzige andere Lösung wäre es, es selbst zu tun, indem Sie python-spidermonkey in Ihre App integrieren.

0

Ihr Code ist intelligent und sehr flexibel zu erweitern, denke ich.

Wie wäre es einfach hinzufügen handle_starttag() und handle_endtag(), um die <Skript> Blöcke zu unterdrücken?

class HTML2Text(HTMLParser.HTMLParser): 
    def __init__(self): 
     HTMLParser.HTMLParser.__init__(self) 
     self.output = cStringIO.StringIO() 
     self.is_in_script = False 
    def get_text(self): 
     return self.output.getvalue() 
    def handle_data(self, data): 
     if not self.is_in_script: 
      self.output.write(data) 
    def handle_starttag(self, tag, attrs): 
     if tag == "script": 
      self.is_in_script = True 
    def handle_endtag(self, tag): 
     if tag == "script": 
      self.is_in_script = False 

def ParseHTML(source): 
    p = HTML2Text() 
    p.feed(source) 
    text = p.get_text() 
    return text 
2

scrape.py kann dies für Sie tun.

Es ist so einfach wie:

import scrape 
s = scrape.Session() 
s.go('yoursite.com') 
print s.doc.text 

Springe zu etwa 02.40 in diesem Video für einen fantastischen Überblick vom Schöpfer scrape.py: pycon.blip.tv/file/3261277