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.nextSibling返回两种不同类型的对象,NavigableString(在它是 a 的情况下<\br>)或 a Tag,在它是一个新<b>元素的情况下。 .name是 a 的有效方法Tag,但不是a 的有效方法NavigatableString。使用它,您可以使用 try/except 子句区分这两种情况。 当元素耗尽时b.nextSibling返回,循环中断。None最后一行附加了最后一个对象。

于 2012-11-15T00:06:56.110 回答