BeautifulSoup - HTML フリーのコンテンツを取得する簡単な方法
-
20-09-2019 - |
質問
このコードを使用して、ページ内の興味深いリンクをすべて検索します。
soup.findAll('a', href=re.compile('^notizia.php\?idn=\d+'))
そして、それはかなりうまく機能します。残念ながらその中には ある tag には、次のようなネストされたタグがたくさんあります フォント, b そしてさまざまなこと...他のHTMLタグを使用せずにテキストコンテンツのみを取得したいと考えています。
リンクの例:
<A HREF="notizia.php?idn=1134" OnMouseOver="verde();" OnMouseOut="blu();"><FONT CLASS="v12"><B>03-11-2009: <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 メソッド内ですが、正規表現は無視されます。なぜ?どうすれば解決できますか?
解決
私はこれを使用しました:
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+'))]
他のヒント
この問題に対する 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: <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(" "," ")
return s
for match in patt.searchString(htmlsrc):
print stripTags(match.body)
プリント:
03-11-2009: CCS Ingegneria Elettronica-Sportello studenti ed orientamento
これは、属性の有無、大文字/小文字などを考慮するため、実際には HTML の変動の影響をほとんど受けません。
所属していません StackOverflow