7

Ich verwende diesen Code zu erhalten, alle interessanten Links in einer Seite zu finden:BeautifulSoup - einfache Möglichkeit, HTML-freie Inhalte

soup.findAll('a', href=re.compile('^notizia.php\?idn=\d+')) 

Und es macht seinen Job sehr gut. Leider in diesem ein Tag gibt es viele verschachtelte Tags, wie Schriftart, b und verschiedene Dinge ... Ich möchte nur den Textinhalt erhalten, ohne andere HTML-Tags.

Beispiel für Link:

<A HREF="notizia.php?idn=1134" OnMouseOver="verde();" OnMouseOut="blu();"><FONT CLASS="v12"><B>03-11-2009:&nbsp;&nbsp;<font color=green>CCS Ingegneria Elettronica-Sportello studenti ed orientamento</B></FONT></A> 

Natürlich hässlich ist es (und das Markup nicht immer das gleiche!), Und ich möchte bekommen:

03-11-2009: CCS Ingegneria Elettronica-Sportello studenti ed orientamento 

In der Dokumentation heißt es zu verwenden text=True in findAll-Methode, aber es ignoriert meine Regex. Warum? Wie kann ich das lösen?

+0

PyQuery klingt wie eine wirklich coole Alternative: http://pypi.python.org/pypi/pyquery –

Antwort

12

Ich habe benutzten:

def textOf(soup): 
    return u''.join(soup.findAll(text=True)) 

So ...

texts = [textOf(n) for n in soup.findAll('a', href=re.compile('^notizia.php\?idn=\d+'))] 
+0

Ich denke, Sie brauchen eine Schleife - Sie können 'findAll' nicht auf einer Ergebnismenge aufrufen, nur auf ein einziges Ergebnis . – RichieHindle

+0

Sie sind so richtig. Bearbeitet; Vielen Dank. –

+0

Es funktioniert! Vielen Dank! –

2

Interesse an einem pyparsing auf das Problem nehmen?

from pyparsing import makeHTMLTags, SkipTo, anyOpenTag, anyCloseTag, ParseException 

htmlsrc = """<A HREF="notizia.php?idn=1134" OnMouseOver="verde();" OnMouseOut="blu();"><FONT CLASS="v12"><B>03-11-2009:&nbsp;&nbsp;<font color=green>CCS Ingegneria Elettronica-Sportello studenti ed orientamento</B></FONT></A>""" 

# create pattern to find interesting <A> tags 
aStart,aEnd = makeHTMLTags("A") 
def matchInterestingHrefsOnly(t): 
    if not t.href.startswith("notizia.php?"): 
     raise ParseException("not interested...") 
aStart.setParseAction(matchInterestingHrefsOnly) 
patt = aStart + SkipTo(aEnd)("body") + aEnd 

# create pattern to strip HTML tags, and convert HTML entities 
stripper = anyOpenTag.suppress() | anyCloseTag.suppress() 
def stripTags(s): 
    s = stripper.transformString(s) 
    s = s.replace("&nbsp;"," ") 
    return s 


for match in patt.searchString(htmlsrc): 
    print stripTags(match.body) 

Drucke:

03-11-2009: CCS Ingegneria Elettronica-Sportello studenti ed orientamento 

Dieses HTML-Kapricen eigentlich ziemlich undurchlässig ist, wie es in Anwesenheit/Abwesenheit von Attributen, Groß-/Kleinschreibung, und so weiter Faktoren.