美丽的汤和框架,iframes提取

时间:2014-04-25 16:51:01

标签: python-2.7 beautifulsoup

我正在尝试学习python和BS4,我试图从使用BS4的页面中提取一些framesiframes,如下所示:

#...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为空..我感到困惑的是为什么会这样:(

可能这是非常愚蠢的事情,但我无法弄清楚出了什么问题! 如果有人能指出我正确的方向,我真的很感激。

1 个答案:

答案 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'))