【问题标题】:Well-formed <script>Javascript</script> tags confuse Nokogiri::HTML in STRICT mode格式良好的 <script>Javascript</script> 标签在 STRICT 模式下混淆 Nokogiri::HTML
【发布时间】:2018-09-15 21:50:38
【问题描述】:

这是说明问题的测试用例:

def test_strict_Nokogiri
  html = "<script> $('<a></a>') </script>"  
  doc = Nokogiri::HTML(html, nil, nil, Nokogiri::XML::ParseOptions::STRICT)  
  assert_empty doc.errors
end

该断言失败,因为有errors:#&lt;Nokogiri::XML::SyntaxError: Unexpected end tag : a&gt;

即使 Nokogiri 一直在 &lt;script&gt; 标签内寻找 HTML 标签,它也应该看到 &lt;a ...&gt;&lt;/a&gt; 标签是平衡的,对吧?

我如何让 Nokogiri 识别有效的 HTML,绕过嵌入的 Javascript,并且只在它真的坏了时才抱怨?

编辑:我已将错误传递给 libxml2 维护人员:https://bugzilla.gnome.org/show_bug.cgi?id=795390

【问题讨论】:

  • 这真的有效吗?我知道script 在 HTML4 中需要一个 type 属性。
  • 我发现了解析带有&lt;script type&gt; 属性的完整网页的问题。而且,在有人编辑我的帖子之前,错误消息中的行号和列号指向了&lt;/a&gt; 标签。

标签: javascript html ruby nokogiri libxml2


【解决方案1】:

如果你想从 Nokogiri 元素中删除脚本标签,你可以这样做,

html = '<div> Hello </div> <script> $("<div></div>") </script>'
doc = Nokogiri::HTML(html, nil, nil, Nokogiri::XML::ParseOptions::STRICT)
doc.text # " Hello   $(\"<div>\") "
doc.xpath('//script').remove
doc.text # " Hello  "

doc.to_html 会返回这个

"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n<div> Hello </div> </body></html>\n"

【讨论】:

  • 我正在尝试使用其&lt;script&gt; 标记编写一个HTML 格式正确的断言。在其他环境中,我会使用 Tidy-HTML5,但不是这个。
  • @Phlip 知道了,所以如果我理解你的话,你需要知道为什么 nokogiri 会这样。对吗?
猜你喜欢
  • 2012-08-24
  • 2014-01-13
  • 1970-01-01
  • 2015-06-07
  • 2013-03-03
  • 2019-08-25
  • 2011-05-13
  • 2014-04-24
  • 1970-01-01
相关资源
最近更新 更多