解析奇怪的网页 - 多个html标签

时间:2013-02-02 06:18:53

标签: python html parsing beautifulsoup

我正在尝试解析一个非常奇怪的页面。这是一个简化版本:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml">
    <form id="x" method="post" action="x">
        <input type="hidden" name="v1" value="v" />
            <html xmlns="http://www.w3.org/1999/xhtml">
                <input type="hidden" name="v2" value="v" />
            </html>
    </form>
</html>

是的,表单中有一个html标记。

这是有效的(X)HTML吗?我知道这是(至少部分地)使用Java Server Faces完成的。

关于实际问题:

>>> BeautifulSoup(html).find("form")
<form id="x" method="post" action="x">
<input type="hidden" name="v1" value="v" />
</form>

BeautifulSoup完全不喜欢这个,只是假装它不存在。

有没有人经历过类似的事情? 我想我可以解析原始XML,但如果可能的话,我想使用BeautifulSoup。

2 个答案:

答案 0 :(得分:3)

我已经看到,在没有检查输出的情况下组合多个服务器源时会发生这种情况。我不认为有html标记在文档中间(iframe标记除外)有效的情况。您发布的片段无效(validator.w3.org)

如果恶意代码出现在可预测的位置,则字符串替换是一种快速解决方案,以便您随后可以正确解析它。

  

我想我可以解析原始XML

假设文档符合其XHTML文档类型的格式良好(意思是,即使无效的XHTML也是有效的XML),您可以:

  • 将文档解析为XML
  • 将标记修改为有效的内容(例如,展开内部元素,或将其更改为div
  • 使用BeautifulSoup解析为HTML。

答案 1 :(得分:0)

为了防止有人需要这个,我最终编写了一个动态字符串替换代码(正如我在评论中提到的,我不能简单地剪切固定位置)

def fix_html_inside_html(html):
    i=html.index("<html")
    while True:
        try:
            i=html.index("<html", i+1)
            i2= html.index(">", i)
            i3= html.index("</html>", i)
            html= html[:i]+html[i2+1:i3]+html[i3+7:]
        except ValueError:
            break
    return html

如果有“&gt;”,请注意失败在html属性中