我正试图抓住这个块:
<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直到你找到一个大胆的兄弟姐妹?
答案 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}}元素。 .name
是Tag
的有效方法,但不是NavigatableString
的有效方法。使用它,您可以使用try / except子句区分这两种情况。当元素耗尽时,b.nextSibling
会返回None
,并且循环会被切断。最后一行追加最后一个对象。