为什么它在有内容时返回一个空数组?

时间:2014-01-16 18:07:55

标签: ruby-on-rails ruby css-selectors web-scraping nokogiri

我正在尝试使用Nokogiri从Google的主页获取自动更正的拼写。

例如,如果我正在打字" hw确实"正确的拼写是""是怎么做的,我必须得到正确的拼写。

我尝试使用xpathcss方法,但在这两种情况下,我得到相同的空数组。

我使用FireBug获得了XPath和CSS路径。

这是我的Nokogiri代码:

@requ=params[:search]
@requ_url=@requ.gsub(" ","+")  //to encode the url(if user inputs space than it should be convet into + )
@doc=Nokogiri::HTML(open("https://www.google.co.in/search?q=#{@requ_url}"))

binding.pry

以下是我的XPath和CSS选择器:

使用XPath:

pry(#<SearchController>)> @doc.xpath("/html/body/div[5]/div[2]/div[6]/div/div[4]/div/div/div[2]/div/p/a").inspect
=> "[]"

使用CSS:

pry(#<SearchController>)> @doc.css('html body#gsr.srp div#main div#cnt.mdm div.mw div#rcnt div.col div#center_col div#taw div div.med p.ssp a.spell').inner_text()
=> ""

1 个答案:

答案 0 :(得分:0)

首先,使用正确的工具来操纵网址;他们会让你头疼。

以下是我找到正确拼写的方法:

require 'nokogiri'
require 'uri'
require 'open-uri'

requ = 'hw did'
uri = URI.parse('https://www.google.co.in/search')
uri.query = URI.encode_www_form({'q' => requ})
doc = Nokogiri::HTML(open(uri.to_s)) 
doc.at('a.spell').text # => "how did"

  

它与“怎么做”一起使用,用“bnglore”或任何一个单词字符串检查它,它会出错。我在以前的代码中遇到的情况也一样。它显示未定义的方法`text'

要弄清楚并不难。他们正在更改HTML,因此您必须更改选择器。 “检查”建议的单词“bangalore”,并查看它与前一个路径相关的位置。一旦你知道了,就很容易找到一种方法来访问这个词:

doc.at('span.spell').next_element.text # => "bangalore"

不要相信Google会以简单的方式,甚至是最好的方式做事,或者保持一致。仅仅因为他们为带有空格的单词返回HTML,并不意味着他们将以相同的方式对单个单词进行操作。 会持续做到这一点,但他们可能会试图阻止您挖掘他们的网页,所以如果您看到变化,请不要感到惊讶。

现在,您需要弄清楚如何编写知道何时使用一个选择器/方法或另一个的代码。这是给你的。