0

我只是尝试使用 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。

4

1 回答 1

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>and<body>中。Nokogiri 会在文档损坏时尝试修复它,这可能会导致标签被移动,或者,我怀疑在这种情况下,参数会丢失。

验证文档会返回各种错误,所以我认为问题出在 Nokogiri 之外。如果你想在将它传递给 Nokogiri 之前尝试修复它,你可以通过 HTMLTidy 发送文件,然后看看 Nokogiri 是否可以更好地理解它。否则,花一些时间挖掘 HTML,找出问题所在,然后编写一些字符串操作代码来修补它。

您无法将浏览器呈现的页面源与解析器(如 Nokogiri)输出的源进行比较。它们是非常不同的代码,具有非常不同的目标。浏览器想要让页面呈现一些东西,并且有各种后备来处理损坏的 HTML。解析器不会,因为它的工作是将 HTML 或 XML 准确地翻译成它的真实结构,以便我们可以挖掘它。

于 2013-04-10T23:58:15.110 回答