7

このコードを使用して、ページ内のすべての興味深いリンクを見つけています。

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

そして、それはその仕事をかなりうまくやっています。残念ながら、そのタグ内には、 fontbなどのネストされタグがたくさんあります...他の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=TruefindAll メソッドで使用するように書かれていますが、私の正規表現は無視されます。なんで?どうすれば解決できますか?

4

2 に答える 2

13

私はこれを使用しました:

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+'))]
于 2009-11-18T00:04:22.400 に答える
2

問題に対する pyparsing に興味がありますか?

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 の気まぐれの影響をほとんど受けません。

于 2009-11-18T00:45:42.803 に答える