刮一个非常典型的文本块

时间:2012-11-14 17:48:33

标签: python web-scraping beautifulsoup

我正试图抓住这个块:

<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直到你找到一个大胆的兄弟姐妹?

1 个答案:

答案 0 :(得分: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(如果是<\br>)或Tag,如果它是新的<b> 1}}元素。 .nameTag的有效方法,但不是NavigatableString的有效方法。使用它,您可以使用try / except子句区分这两种情况。当元素耗尽时,b.nextSibling会返回None,并且循环会被切断。最后一行追加最后一个对象。