2

私はこのブロックをこすり取ろうとしています:

<b>Address:</b></br>
First Line</br>
Second Line</br>
City, State Zip</br>
 <b>Phone: 718-555-2121</br>
 <b>Fax:</b> 718-555-1212</br>
 <b>Email:</b> ex@example.com</br>

確実に口述に。

dict = {
    'address':'First Line\n Second Line\n City, State Zip\n',
    'phone':'718-555-2121',
    'Fax:':'718-555-1212',
    'Email:':'ex@example.com',
    }

太字で次にnext_siblingを探すと、電話番号、ファックス、電子メールは問題なく表示されますが、アドレスはほんの一握りの兄弟です。

for nut in soup.find_all("b"):
    print nut,
    try:
        print nut.next_sibling.tag
    except:
        print nut.next_sibling

太字で次にnext_siblingsを探すと、すべての兄弟が表示されます。

for nut in soup.find_all("b"):
    print nut
    for s,sibling in enumerate(nut.next_siblings):
        print s, (repr(sibling))

while大胆な兄弟に到達するまでnext_siblingsを組み立て続けると言うクリーンな方法(?)はありますか?

4

1 に答える 1

0

さて、私はあなたの方法を使って少しそれに取り組みました、そして私はこれを思いつきました。

b = soup.b
results = []
result = str()
while b != None:
    try:
        if b.name == 'b':
            results.append(result)
            result = b.text
    except AttributeError:
        result = result + b
    b = b.nextSibling
results.append(result)

ちょっと醜いと思います。しかし、それはかなり簡単に理解できるはずです。

b.nextSibling2つの異なる種類のオブジェクトNavigableString(それがの場合<\br>)またはTagそれが新しい<b>要素の場合はを返します。 .nameはの有効なメソッドですが、の有効なメソッドではありTagませんNavigatableString。これを使用すると、try/except句を使用して2つのケースを区別できます。 要素が使い果たされ、ループが切断されるとb.nextSibling戻ります。None最後の行は最後のオブジェクトを追加します。

于 2012-11-15T00:06:56.110 に答える