【问题标题】:Why do I get bad output when using Nokogiri "search"?为什么我在使用 Nokogiri “搜索”时会得到错误的输出?
【发布时间】:2014-01-06 22:22:02
【问题描述】:

我想从 CarFax 报告的特定 div 中抓取数据。但是,当我搜索 div 时,我总是得到这个奇怪的垃圾输出。

我尝试了search(#divId)search(.divClass),甚至尝试使用search('div') 抓取所有div。每次我得到类似的结果:div的内容被部分截断,标签都乱七八糟。

这是我正在加载到我的agent 中的 URL:https://gist.github.com/atkolkma/8024287

这是代码(用户和密码省略):

require "rubygems"
require "mechanize"

scraper = Mechanize.new
scraper.user_agent_alias = 'Mac Safari'
scraper.follow_meta_refresh = true
scraper.redirect_ok = true

scraper.get("http://www.carfaxonline.com")
form = scraper.page.forms.first
form.j_username = "******"
form.j_password = "*****"
scraper.submit(form)

scraper.get("http://www.carfaxonline.com/api/report?vin=1G1AT58H697144202&track=true")

puts scraper.page.search("#headerBodyType")

这是我运行文件时返回的内容:

</div>4 DRderBodyType">

我的期望是:

<div id="headerBodyType"> SEDAN 4 DR </div>

最奇怪的是,如果我复制 HTML 源代码,将其另存为新文件,上传并search 它,我会得到正确的输出!我已将复制的 HTML 上传到我的 chevy-pics dot com 域并运行以下代码:

scraper2 = Mechanize.new

scraper2.get("http://www.chevy-pics.com/test.html")

puts scraper2.page.search("#headerBodyType")

正如预期的那样,我得到了这个作为输出:

<div id="headerBodyType"> SEDAN 4 DR </div>

【问题讨论】:

  • 示例代码会有很大帮助。
  • 首先,Nokogiri 只会做你告诉它做的事情,除非你偶然发现了一个错误,这是极不可能的。其次,没有您的代码,我们无法帮助您。 “有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包括有效的代码来重现它。有关指导,请参阅SSCCE.org。”将您正在解析的 HTML 剥离到重现问题所需的最低限度。
  • 感谢您的意见,伙计们。我已经更新了问题。

标签: ruby nokogiri mechanize


【解决方案1】:

我可以通过将编辑器中的文件的行尾更改为 Mac OS 9 来重现这一点,它使用单个 \r (carriage return) 字符。当您在结果字符串上使用puts 时,每次看到此字符时控制台都会返回到行首,但不会开始新行。因此,每一行都会覆盖之前的内容,最终您看到的输出已损坏。

您应该能够通过使用p 而不是puts 来判断是否是这种情况。您应该会看到类似"&lt;div id=\"headerBodyType\"&gt;\r SEDAN 4 DR\r &lt;/div&gt;" 的输出。注意用作换行符的 \r 字符。

您从查询中获得的实际结果是正确的,它只是显示导致问题的原因。解决方案可能只是在文本上使用gsub\r 转换为更正常的\n。我不知道执行此操作的最佳位置,也许可以在 Mechanize 将其交给 Nokogiri 进行解析之前更改整个文档,但我不知道您会怎么做。

您可能只需要更改您获得的任何结果,作为开始尝试:

puts scraper.page.search("#headerBodyType").to_s.gsub("\r", "\n")

【讨论】:

  • 查看实际站点,他们似乎使用\r\n(即Windows)换行符,但我无法检查导致问题的实际页面,因为它位于密码后面。因此,可能只是该页面出于某种原因使用了\r,或者 Mechanize 正在做某事,或者完全是其他事情。
  • 谢谢!我有一种感觉,这在某种程度上与它的格式化方式有关,但我一无所获。我现在就试试这个。
  • 这种方法效果很好。谢谢!我现在非常了解 Nokogiri,但我对文本格式和编码一无所知,所以我可能永远也想不通。
猜你喜欢
  • 2021-11-11
  • 2019-01-25
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多