【问题标题】:How do I convert a Nokogiri statement into Mechanize for screen scraping?如何将 Nokogiri 语句转换为 Mechanize 以进行屏幕抓取?
【发布时间】:2013-05-08 02:33:23
【问题描述】:

我正在尝试使用 Mechanize 从页面中删除一些标签。我以前曾成功地使用 Nokogiri 来抓取它们,但现在我正试图将它们组合成一个更广泛的 Mechanize 类。这是 Nokogiri 声明:

page = Nokogiri::HTML(open(@model.url, "User-Agent" => request.env['HTTP_USER_AGENT']))
@model.icons = page.css("link[rel='apple-touch-icon']").to_s

这是我认为的 Mechanize 等价物,但它不起作用:

agent = Mechanize.new
page = agent.get(@model.url, "User-Agent" => request.env['HTTP_USER_AGENT'])
@model.icons = page.search("link[rel='apple-touch-icon']").to_s

第一个按预期返回链接标签<link rel="apple-touch-icon" etc etc..></link>。第二条语句返回一个空白字符串。如果我把to_s 去掉,我会得到一个超长的输出。我认为这是一个错误或实际的 Mechanize 对象或其他东西。

不转换为字符串时链接到长输出:https://gist.github.com/eadam/5583541

【问题讨论】:

  • 定义“不工作”。 search 方法的返回值是什么?你期望得到什么?如果您将我们指向该页面或包含适当的 sn-p,这也会有所帮助。
  • 我已经用完整的陈述和不工作的定义更新了这个问题。谢谢。
  • 你能发布你得到的“超长输出”吗?
  • 请不要将链接指向您的“长输出”。 WHEN 该链接破坏了您的问题,对于将来寻找相同答案的其他人来说将毫无用处。相反,如果链接真的那么长,请总结您要链接的内容,并提供指向完整信息的链接。如果不是那么长,请将其附加到您的问题中。

标签: ruby-on-rails ruby nokogiri mechanize mechanize-ruby


【解决方案1】:

如果没有示例 HTML,则很难重现问题,因此这是一些可能对您有所帮助的一般信息。

“长输出”是您使用search 方法时得到的 Nokogiri::NodeSet 的inspect 输出。如果search 返回多个节点,或者节点有很多子节点,则inspect 输出可以继续,但是,这就是它应该做的。

csssearch 非常相似,因为它们返回一个 NodeSet。 css 假定传入的字符串是 CSS 访问器,而 search 更通用,并试图确定传入的是 CSS 还是 XPath 表达式。如果计算错误,则模式找到匹配项的可能性很小。您可以使用atsearch 来通用并让Nokogiri 自己解决,或者at_cssat_xpathcssxpath 分别替换它们。 at 派生都返回第一个匹配的节点,类似于使用search('some_path').first

为什么不像 css 那样获得 search 的输出?我不知道,因为我无法针对您正在解析的 HTML 进行测试。回答问题,如数据处理,是一种 GIGO 情况。

【讨论】:

    猜你喜欢
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2013-07-19
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多