【问题标题】:Why it is returning an empty array while it has content?为什么它有内容时返回一个空数组?
【发布时间】:2014-01-17 05:00:09
【问题描述】:

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

例如,如果我输入“hw did”并且正确的拼写是“how did”,我必须得到正确的拼写。

我尝试使用 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()
=> ""

【问题讨论】:

  • 您可能使用了错误的 xpath,firebug 可能已经修改了 html 尝试以下,虽然未经测试,但从 chrome 开发人员工具 //*[@id="gsr"]/table/tbody/tr/td[2]/table/tbody/tr[1]/td/div/table/tbody/tr/td[1]/span 复制而来,顺便说一句,您不应该依赖谷歌来做这样的事情或者以您的方式,他们明天可以在不通知您的情况下更改他们的设计
  • 为什么你的例子中有&lt;br&gt;标签?是你添加的,还是从一些 HTML 源中复制的?
  • @tin man,不,我的示例中没有任何 br 标签,这里只是为了格式化我在 stackoverflow 上的问题。
  • 啊。它们不适用于代码/预格式化。

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


【解决方案1】:

首先,使用正确的工具来操作 URL;他们会省去你的麻烦。

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

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"

它与“how did”一起工作正常,用“bnglore”或任何一个单词字符串检查它,它给出了一个错误。我在之前的代码中也面临同样的问题。它显示未定义的方法`text'

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

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

不要相信 Google 会以简单的方式做事,甚至是最好的方式,或者始终如一。仅仅因为他们为带有空格的单词返回 HTML 的一种方式,并不意味着他们将对单个单词以相同的方式执行此操作。 会一直这样做,但他们可能会试图阻止你挖掘他们的页面,所以如果你看到变化不要感到惊讶。

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

【讨论】:

  • 它与“how did”一起工作正常,用“bnglore”或任何一个单词字符串检查它,它给出了一个错误。我在之前的代码中也面临同样的问题。它显示未定义的方法“文本”
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2022-01-06
  • 2015-03-18
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多