BeautifulSoup - простой способ получения содержимого без HTML - PullRequest
7 голосов
/ 18 ноября 2009

Я использую этот код, чтобы найти все интересные ссылки на странице:

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

И он делает свою работу довольно хорошо. К сожалению, внутри этого тега a есть много вложенных тегов, таких как font , b и другие вещи ... Я хотел бы получить только текст содержание, без каких-либо других тегов HTML.

Пример ссылки:

<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>

Конечно, это некрасиво (и разметка не всегда одинакова!), И я бы хотел получить:

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

В документации сказано использовать text=True в методе findAll, но он игнорирует мое регулярное выражение. Зачем? Как я могу решить это?

Ответы [ 2 ]

12 голосов
/ 18 ноября 2009

Я использовал это:

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

Итак ...

texts = [textOf(n) for n in soup.findAll('a', href=re.compile('^notizia.php\?idn=\d+'))]
2 голосов
/ 18 ноября 2009

Хотите узнать о проблеме?

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)

Печать:

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

Это на самом деле довольно непроницаемо для капризов HTML, так как учитывает наличие / отсутствие атрибутов, прописных / строчных букв и т. Д.

...