我正在尝试学习python和BS4,我试图从使用BS4的页面中提取一些frames
和iframes
,如下所示:
#...snip...
soup_f = soup("frame")
if soup_f is not None:
for frame in soup_f:
try:
t_iFrames_src.append(force_text(soup.frame.extract().get("src"), encoding='utf-8', strings_only=False, errors='strict'))
except (AttributeError, UnicodeEncodeError):
pass
try:
t_full_frame.append(force_text(soup.frame.extract(), encoding='utf-8', strings_only=False, errors='strict'))
except (AttributeError, UnicodeEncodeError):
pass
else:
pass
问题是,当第一个try..except
运行时,它会获得有效的结果(通过填充t_iFrames_src
),但由于一些奇怪的原因,第二个try...except
不会给我任何结果结果。即t_full_frame
是空的
所以,当我像这样翻转它们时:
#...snip...
soup_f = soup("frame")
if soup_f is not None:
for frame in soup_f:
try:
t_full_frame.append(force_text(soup.frame.extract(), encoding='utf-8', strings_only=False, errors='strict'))
except (AttributeError, UnicodeEncodeError):
pass
try:
t_iFrames_src.append(force_text(soup.frame.extract().get("src"), encoding='utf-8', strings_only=False, errors='strict'))
except (AttributeError, UnicodeEncodeError):
pass
else:
pass
现在,t_full_frame
有结果,但t_iFrames_src
为空..我感到困惑的是为什么会这样:(
可能这是非常愚蠢的事情,但我无法弄清楚出了什么问题! 如果有人能指出我正确的方向,我真的很感激。
答案 0 :(得分:1)
当您致电soup.tag.extract()
时,BeautifulSoup 会移除并从汤中返回tag
的第一个实例。请注意以下事项:
from bs4 import BeautifulSoup
soup = BeautifulSoup('''
<frame src='foo'>Spam</frame>
<frame src='bar'>Eggs</frame>
''')
print(soup)
soup.frame.extract()
print(soup)
这给出了以下输出:
<frame src="foo">Spam</frame>
<frame src="bar">Eggs</frame>
<frame src="bar">Eggs</frame>
我猜这不是你想要的行为 - 第一个try
块正在将frame
踢出汤,因此第二个{{1}无效阻止。您可能希望保持汤完整,在这种情况下,您不应该使用try
。只需引用.extract()
(soup.frame.extract()
循环中的变量),即可将来电替换为frame
。
即改变这些行:
for
这些行:
t_iFrames_src.append(force_text(soup.frame.extract().get("src"), encoding='utf-8', strings_only=False, errors='strict'))
t_full_frame.append(force_text(soup.frame.extract(), encoding='utf-8', strings_only=False, errors='strict'))