我正在尝试抓取这个 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当元素耗尽时,循环中断。最后一行附加最后一个对象。
