1

私はBeautifulSoupを使用して画面スクレイピングを行っています。私の問題はこれです:段落から特定のものを抽出する必要があります。例:

<p><b><a href="/name/abe">ABE</a></b> &nbsp; <font class="masc">m</font> &nbsp; <font class="info"><a href="/nmc/eng.php" class="usg">English</a>, <a href="/nmc/jew.php" class="usg">Hebrew</a></font><br />Short form of <a href="/name/abraham" class="nl">ABRAHAM</a>

この段落から、次のようにABEという名前を抽出できます。

for pFound in soup.findAll('p'):

    print pFound


#will get the names
    x = pFound.find('a').renderContents()
    print x

今、私の問題は、同じ段落で他の名前も抽出することです。

Short form of <a href="/name/abraham" class="nl">ABRAHAM</a>

タグaの前に「Shortformof」というテキストが付いている場合にのみ、これを抽出する必要があります。

これを行う方法についてのアイデアはありますか?HTMLページにはそのような段落がたくさんあり、すべてに「短い形式」というテキストが含まれているわけではありません。その場所に他のテキストが含まれている可能性があります。

正規表現とfindNext()の組み合わせが役立つと思いますが、BeautifulSoupには慣れていません。かなりの時間を無駄にしてしまいました。

どんな助けでもいただければ幸いです。ありがとう。

4

2 に答える 2

1

以下が機能するはずです...:

htm = '''<p><b><a href="/name/abe">ABE</a></b> &nbsp; <font class="masc">m
</font>&nbsp; <font class="info"><a href="/nmc/eng.php" class="usg">English
</a>, <a href="/nmc/jew.php" class="usg">Hebrew</a></font><br />
Short form of <a href="/name/abraham" class="nl">ABRAHAM</a>'''

import BeautifulSoup

soup = BeautifulSoup.BeautifulSoup(htm)

for p in soup.findAll('p'):
  firsta = True
  shortf = False
  for c in p.recursiveChildGenerator():
    if isinstance(c, BeautifulSoup.NavigableString):
      if 'Short form of' in str(c):
        shortf = True
    elif c.name == 'a':
      if firsta or shortf:
        print c.renderContents()
        firsta = shortf = False
于 2010-07-03T00:57:55.487 に答える
0

pyparsingは、HTMLを解析するための一種の「スーパー正規表現」として使用できます。典型的な正規表現HTMLスクレイピングの落とし穴(予測できないタグ/属性文字の大文字小文字、予測できない属性、順序が狂っている属性、予測できない空白)につまずくことなく、さまざまな開始タグと終了タグを組み立てることで、単純なマッチングパターンをまとめることができます。次に、pattern.scanStringは、HTMLソースをスキャンし、一致したトークンのタプル、開始位置、および終了位置を返すジェネレーターを返します。結果名の割り当て(正規表現の名前付きフィールドと同様)をスローし、関心のある個々のフィールドにアクセスするのは簡単です。

html = """<some leading html>
<p><b><a href="/name/abe">ABE</a></b> &nbsp; <font class="masc">m</font> &nbsp; 
<font class="info"><a href="/nmc/eng.php" class="usg">English</a>, <a href="/nmc/jew.php" class="usg">
Hebrew</a></font><br />Short form of <a href="/name/abraham" class="nl">ABRAHAM</a>
<some trailing html>"""

from pyparsing import makeHTMLTags, SkipTo, Optional

pTag,pEnd = makeHTMLTags("P")
bTag,bEnd = makeHTMLTags("B")
aTag,aEnd = makeHTMLTags("A")
fontTag,fontEnd = makeHTMLTags("FONT")
brTag = makeHTMLTags("BR")[0]
nbsp = "&nbsp;"

nickEntry = (pTag + bTag + aTag + SkipTo(aEnd)("nickname") + aEnd + bEnd + Optional(nbsp) + 
            fontTag + SkipTo(fontEnd) + fontEnd + Optional(nbsp) +
            fontTag + aTag + SkipTo(aEnd) + aEnd + "," +
            aTag + SkipTo(aEnd) + aEnd + fontEnd + 
            brTag + "Short form of" +
            aTag + SkipTo(aEnd)("fullname") + aEnd)

for match,_,_ in nickEntry.scanString(html):
    print match.nickname, "->", match.fullname

プリント:

ABE -> ABRAHAM
于 2010-07-03T02:47:53.537 に答える