BeautifulSoup get_text nicht alle Tags und JavaScript

Ich versuche, BeautifulSoup zu verwenden, um Text von Webseiten zu bekommen.

Unten ist ein Skript, das ich geschrieben habe. Es dauert zwei Argumente, zuerst ist die eingegebene HTML- oder XML-Datei, die zweite Ausgabedatei.

import sys from bs4 import BeautifulSoup def stripTags(s): return BeautifulSoup(s).get_text() def stripTagsFromFile(inFile, outFile): open(outFile, 'w').write(stripTags(open(inFile).read()).encode("utf-8")) def main(argv): if len(sys.argv) <> 3: print 'Usage:\t\t', sys.argv[0], 'input.html output.txt' return 1 stripTagsFromFile(sys.argv[1], sys.argv[2]) return 0 if __name__ == "__main__": sys.exit(main(sys.argv)) 

Leider für viele Web-Seiten, zum Beispiel: http://www.greatjobsinteaching.co.uk/career/134112/Education-Manager-Location bekomme ich so etwas (ich zeige nur wenige erste Zeilen):

 html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" Education Manager Job In London With Caleeda | Great Jobs In Teaching var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-15255540-21']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); 

Gibt es etwas falsch mit meinem Drehbuch? Ich habe versucht, 'xml' als das zweite Argument an BeautifulSoup's Konstruktor, sowie 'html5lib' und 'lxml' zu übergeben, aber es hilft nicht. Gibt es eine Alternative zu BeautifulSoup, die für diese Aufgabe besser funktionieren würde? Alles, was ich möchte, ist, den Text zu extrahieren, der in einem Browser für diese Webseite gerendert würde.

Jede Hilfe wird sehr geschätzt.

  • Python: Getting Text von HTML mit Beatifulsoup
  • Schöne Suppe versäumt es, diesen HTML zu analysieren
  • So stellen Sie den Pfad zu einem Browser ein, der mit python webbrowser ausführbar ist
  • Python: Ein anderes 'NoneType'-Objekt hat keinen Attributfehler
  • BeautifulSoup: komm einfach in einen Tag, egal wie viele umschließende Tags dort sind
  • Amazon Web-Scraping
  • 3 Solutions collect form web for “BeautifulSoup get_text nicht alle Tags und JavaScript”

    Nltk's clean_html() ist ganz gut dabei!

    Angenommen, dass Sie bereits Ihre HTML-Datei in einer Variablen html wie gespeichert

     html = urllib.urlopen(address).read() 

    Dann benutze einfach

     import nltk clean_text = nltk.clean_html(html) 

    AKTUALISIEREN

    Unterstützung für clean_html und clean_url wird für zukünftige Versionen von nltk gelöscht. Bitte nutzen Sie jetzt BeautifulSoup … es ist sehr unglücklich.

    Ein Beispiel dafür, wie dies zu erreichen ist auf dieser Seite:

    BeatifulSoup4 got_text hat noch Javascript

    Das war das Problem, das ich hatte. Keine Lösung schien in der Lage sein, den Text zurückzusenden (der Text, der tatsächlich im Web broswer gerendert werden würde). Andere Lösungen erwähnten, dass BS nicht ideal für das Rendering ist und dass html2text ein guter Ansatz war. Ich habe versucht, html2text und nltk.clean_html und war überrascht von den Timing-Ergebnisse so dachte sie eine Antwort für die Nachwelt gerechtfertigt. Natürlich kann das Speed-Delta in hohem Maße vom Inhalt der Daten abhängen …

    Eine Antwort hier von @Helge war über die Verwendung von nltk aller Dinge.

     import nltk %timeit nltk.clean_html(html) was returning 153 us per loop 

    Es funktionierte wirklich gut, um einen String mit gerenderten html zurückzugeben. Dieses nltk-Modul war schneller als sogar html2text, obwohl vielleicht html2text robuster ist.

     betterHTML = html.decode(errors='ignore') %timeit html2text.html2text(betterHTML) %3.09 ms per loop 

    Hier ist ein Ansatz, der auf der Antwort hier basiert: BeautifulSoup Grab Sichtbare Webseite Text von jbochi. Dieser Ansatz ermöglicht Kommentare, die in Elementen eingebettet sind, die Seitentext enthalten, und tut ein bisschen, um die Ausgabe durch Strippen von Zeilenumbrüchen aufzuräumen, Platz zu sammeln usw.

     html = urllib.urlopen(address).read() soup = BeautifulSoup.BeautifulSoup(html) texts = soup.findAll(text=True) def visible_text(element): if element.parent.name in ['style', 'script', '[document]', 'head', 'title']: return '' result = re.sub('<!--.*-->|\r|\n', '', str(element), flags=re.DOTALL) result = re.sub('\s{2,}|&nbsp;', ' ', result) return result visible_elements = [visible_text(elem) for elem in texts] visible_text = ''.join(visible_elements) print(visible_text) 
    Python ist die beste Programmiersprache der Welt.