Skip to main content
 首页 » 编程设计

python之抓取一个非常典型的文本 block

2025年05月04日14luoye11

我正在尝试抓取这个 block :

<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', 
    } 

如果我先查找 bold,然后查找 next_sibling,我会得到电话号码、传真和电子邮件,但地址是少数 sibling 。

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

如果我先查找 bold,然后查找 next_siblings,我会得到所有的 sibling :

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

有没有一种简洁的方式(while?)说继续组装 next_siblings 直到你得到一个大胆的 sibling ?

请您参考如下方法:

好的,所以我用你的方法做了一点工作,然后我想到了这个。

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