【问题标题】:beautiful soup and frames, iframes extract美丽的汤和框架,iframe 提取物
【发布时间】:2014-04-25 16:51:01
【问题描述】:

我正在尝试学习 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 是空的。我很困惑为什么会这样 :(

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

【问题讨论】:

    标签: python-2.7 beautifulsoup


    【解决方案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 从汤中踢出,因此第二个 try 块无法使用它。您可能希望保持汤完整,在这种情况下,您不应该使用.extract()。将您对soup.frame.extract() 的调用替换为仅引用framefor 循环中的变量)。

    也就是说,改变这些行:

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

    到这些行:

    t_iFrames_src.append(force_text(frame.get("src"), encoding='utf-8', strings_only=False, errors='strict'))
                                    ^^^^^
    t_full_frame.append(force_text(frame, encoding='utf-8', strings_only=False, errors='strict'))
                                   ^^^^^
    

    【讨论】:

    • 非常感谢 senshin 的回答。我困惑了大约 3 个小时,试图弄清楚 WTF 正在发生。仍然不确定为什么 extract 会将元素从列表中剔除。奇怪的。无论如何,您的解决方案非常有效。已采纳您的答案!再次感谢您的所有帮助伙伴 - 您为我节省了很多时间!
    • @JohnJ 很高兴我能帮上忙。如果您遇到任何其他看似行为不端的方法,可能值得看看 BeautifulSoup docs
    猜你喜欢
    • 2021-06-05
    • 2015-05-08
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2020-01-19
    • 2021-04-03
    • 2016-09-11
    • 2018-09-13
    相关资源
    最近更新 更多