我想从CarFax报告中的特定div中获取数据。但是,当我搜索div时,我总是得到这个奇怪的垃圾输出。
我尝试了search(#divId)
,search(.divClass)
,甚至尝试使用search('div')
获取所有div。每次我得到类似的结果:div的内容被部分截断,标签都搞砸了。
这是我加载到agent
:https://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>
答案 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")