2

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

<!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。

4

2 回答 2

3

我已经看到当多个服务器源合并而不检查输出时会发生这种情况。我不认为存在html标签在文档中间有效的情况(除了在iframe标签中)。您发布的片段肯定无效(validator.w3.org)

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

我想我可以解析原始 XML

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

  • 将文档解析为 XML
  • 将标记修改为有效的东西(例如打开内部元素,或将其更改为 a div
  • 使用 BeautifulSoup 解析为 HTML。
于 2013-02-02T06:22:58.730 回答
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

请注意,如果 html 属性中有“>”,这将失败

于 2013-02-02T07:18:24.080 回答