我正在尝试解析一个非常奇怪的页面。这是一个简化版本:
<!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。
答案 0 :(得分:3)
我已经看到,在没有检查输出的情况下组合多个服务器源时会发生这种情况。我不认为有html
标记在文档中间(iframe
标记除外)有效的情况。您发布的片段无效(validator.w3.org)
如果恶意代码出现在可预测的位置,则字符串替换是一种快速解决方案,以便您随后可以正确解析它。
我想我可以解析原始XML
假设文档符合其XHTML文档类型的格式良好(意思是,即使无效的XHTML也是有效的XML),您可以:
div
)答案 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属性中