使用Nokogiri“搜索”时为什么会输出错误?

时间:2013-12-18 16:22:01

标签: ruby nokogiri mechanize

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

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

这是我加载到agenthttps://gist.github.com/atkolkma/8024287

中的网址

这是代码(用户并通过ommited):

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>

1 个答案:

答案 0 :(得分:2)

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

您应该能够使用p代替puts来判断是否属于这种情况。您应该看到"<div id=\"headerBodyType\">\r SEDAN 4 DR\r </div>"之类的内容作为输出。请注意用作换行符的\r个字符。

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

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

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