Nokogiri失去了属性

时间:2013-04-10 18:30:56

标签: ruby-on-rails ruby nokogiri

我只是尝试使用nokogiri代理网站解析。

我的控制器操作

des show
  @url                = 'http://www.femmeactuelle.fr/'
  @with_nokogiri      = Nokogiri::HTML(open(@url).read).to_html
  @without_nokogiri   = open(@url).read

  if params.has_key? :nokogiri
    render text: @with_nokogiri, layout: false
  else
    render text: @without_nokogiri, layout: false
  end
end

如果我对?nokogiri = foo 使用此操作,则身体会丢失其ID。任何想法是什么原因? 我只想要与浏览器在使用nokogiri解析后看到的相同的HTML。

1 个答案:

答案 0 :(得分:2)

我无法复制Nokogiri从有效HTML中的id标记中剥离<body>参数的问题。这是我的Nokogiri / LibXML和Ruby细节:

nokogiri: 1.5.9
ruby:
  version: 1.9.3
  platform: x86_64-darwin10.8.0
  description: ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin10.8.0]
  engine: ruby
libxml:
  binding: extension
  compiled: 2.7.7
  loaded: 2.7.7

这是对Nokogiri的简单测试:

doc = Nokogiri::HTML('<html><body id="foo">bar</body></html>')

puts doc.to_html

返回:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body id="foo">bar</body></html>

当我解析“http://www.femmeactuelle.fr/”时,Nokogiri的errors方法会返回一些错误,包括<head><body>。 Nokogiri试图在文档损坏时修复它,这可能导致标签被移动,或者,正如我怀疑在这种情况下,参数会丢失。

Validating the document会返回各种错误,因此我认为问题出在Nokogiri之外。如果你想在将它传递给Nokogiri之前尝试修复它,你可以通过HTMLTidy发送文件,然后看看Nokogiri是否能更好地理解它。否则,花一些时间挖掘HTML,弄清楚什么是坏的,并编写一些字符串操作代码来修补它。

您无法将浏览器呈现的页面源与Nokogiri等解析器的输出进行比较。它们是非常不同的代码片段,目标非常不同。浏览器希望使页面呈现某些东西,并且具有处理破坏的HTML的各种后备。解析器没有,因为它的工作是准确地将HTML或XML转换为其真实结构,以便我们可以深入研究它。