Frage

Ich versuche, Text aus beliebigen HTML-Seiten zu extrahieren. Einige der Seiten (die ich habe keine Kontrolle über) haben ungültige HTML oder Skripte, die dies erschweren. Auch ich ist auf einer Shared-Hosting-Umgebung, so kann ich jede Python lib installieren, aber ich kann nicht einfach alles, was ich auf dem Server will installieren.

pyparsing und html2text.py auch offenbar nicht für fehlerhafte HTML-Seiten zu arbeiten.

Beispiel-URL ist http://apnews.myway.com/article/20091015/ D9BB7CGG1.html

Meine aktuelle Implementierung ist etwa folgende:

# Try using BeautifulSoup 3.0.7a
soup = BeautifulSoup.BeautifulSoup(s) 
comments = soup.findAll(text=lambda text:isinstance(text,Comment))
[comment.extract() for comment in comments]
c=soup.findAll('script')
for i in c:
    i.extract()    
body = bsoup.body(text=True)
text = ''.join(body) 
# if BeautifulSoup  can't handle it, 
# alter html by trying to find 1st instance of  "<body" and replace everything prior to that, with "<html><head></head>"
# try beautifulsoup again with new html 

Wenn beautifulsoup immer noch nicht funktioniert, dann greife ich mit einer Heuristik Blick auf den ersten Zeichen, letztes Zeichen (um zu sehen, ob sie wie seine eine Codezeile # sieht <, und eine Probe von der Linie nehmen und dann prüfen, wenn die Token Englisch Worte oder Zahlen. wenn zu wenige der Token sind Worte oder Zahlen, dann denke ich, dass der Leitungscode ist.

konnte ich maschinelles Lernen verwenden, um jede Zeile zu untersuchen, aber das scheint ein wenig teuer, und ich würde es wahrscheinlich trainieren müssen (da ich so viel nicht wissen, über unbeaufsichtigt Lernmaschinen), und natürlich schreiben sie auch.

Jede Beratung, Werkzeuge, wären Strategien sehr willkommen. Mir ist auch klar, dass der letzte Teil, dass ziemlich chaotisch ist, da, wenn ich eine Linie erhalten, die Code enthalten ist festzustellen, ich zur Zeit die gesamte Linie wegzuwerfen, auch wenn es eine kleine Menge an tatsächlichen englischen Text in der Zeile ist.

War es hilfreich?

Lösung

Versuchen Sie, nicht zu lachen, aber:

class TextFormatter:
    def __init__(self,lynx='/usr/bin/lynx'):
        self.lynx = lynx

    def html2text(self, unicode_html_source):
        "Expects unicode; returns unicode"
        return Popen([self.lynx, 
                      '-assume-charset=UTF-8', 
                      '-display-charset=UTF-8', 
                      '-dump', 
                      '-stdin'], 
                      stdin=PIPE, 
                      stdout=PIPE).communicate(input=unicode_html_source.encode('utf-8'))[0].decode('utf-8')

Ich hoffe, du hast Luchs!

Andere Tipps

Nun, es hängt davon, wie gut die Lösung sein muss. Ich hatte ein ähnliches Problem, Hunderte von alten HTML-Seiten in eine neue Website zu importieren. Ich habe im Grunde

# remove all that crap around the body and let BS fix the tags
newhtml = "<html><body>%s</body></html>" % (
    u''.join( unicode( tag ) for tag in BeautifulSoup( oldhtml ).body.contents ))
# use html2text to turn it into text
text = html2text( newhtml )

und es hat geklappt, aber natürlich könnten die Dokumente so schlecht sein, dass auch BS nicht viel retten kann.

BeautifulSoup wird mit ungültigem HTML schlecht tun. Was über einige Regex-fu?

>>> import re
>>> 
>>> html = """<p>This is paragraph with a bunch of lines
... from a news story.</p>"""
>>> 
>>> pattern = re.compile('(?<=p>).+(?=</p)', re.DOTALL)
>>> pattern.search(html).group()
'This is paragraph with a bunch of lines\nfrom a news story.'

Sie können dann Baugruppe eine Liste der gültigen Tags, von denen Sie Informationen extrahieren möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top