如何找到包含此文本的标签?

时间:2013-10-02 16:53:03

标签: ruby nokogiri open-uri

我正在使用Open :: URI和Nokogiri来搜索Google搜索页面:

 require 'open-uri'
 require 'nokogiri'
 url = http://www.google.co.uk/search?&q=toys&start=0&num=&complete=0
 doc = Nokogiri::HTML(open(url))
 mas = doc.css('li.g')[7]
 mas.at_css('.mas-row')

从这个结果我只对一个结果感兴趣:

"Amazon.co.uk: Toys - Harry Potter: Toys & Games"

我希望从"div class mas-row"获取数据。

我找不到它。我查看了“doc”变量,但无法找到它。 之后我查找了那个“div”中的文本,并且对于第一个div,找到了文本的一部分,但是没有找到下一个div。

任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:3)

HTML中包含div mas-row。它由JavaScript呈现。

使用可以处理JavaScript的库,例如selenium。

答案 1 :(得分:0)

首先,它由 JavaScript 呈现。其次,它可能不返回任何内容,因为没有指定 user-agentWhat is my user-agent?第三,如果您只想检索一个(first)结果,您可以使用 xpathnokogiri at_xpath shortcut,例如:

doc.at_xpath('//*[@id="rso"]/div[1]/div/div/div[1]/a/h3').text
# or exclusively with xpath by adding text()
doc.at_xpath('//*[@id="rso"]/div[1]/div/div/div[1]/a/h3/text()')

代码:

require 'nokogiri'
require 'httparty'

headers = {
  "User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}

params = {
  q: "Amazon.co.uk: Toys - Harry Potter: Toys & Games",
  hl: "en"
}

response = HTTParty.get('https://www.google.com/search',
                        :query => params,
                        :headers => headers)
doc = Nokogiri::HTML(response.body)

puts doc.at_xpath('//*[@id="rso"]/div[1]/div/div/div[1]/a/h3/text()'), 
     doc.at_xpath('//*[@id="rso"]/div[1]/div/div/div[1]/a/@href')

---
#=> Harry Potter: Toys & Games - Amazon.co.uk
#=> https://www.amazon.co.uk/Toys-Games-Harry-Potter/s?rh=n%3A468292%2Cp_89%3AHarry+Potter

或者,您可以使用来自 SerpApi 的 Google Organic Results API 来实现此目的。这是一个带有免费计划的付费 API。主要区别之一是您只需要迭代结构化的 json

要集成的代码:

require 'google_search_results' 

params = {
  api_key: ENV["API_KEY"],
  engine: "google",
  q: "Amazon.co.uk: Toys - Harry Potter: Toys & Games",
  hl: "en"
}

search = GoogleSearch.new(params)
hash_results = search.get_hash

# [0] first element from organic results
puts hash_results[:organic_results][0][:title], 
     hash_results[:organic_results][0][:link]

#=> Harry Potter: Toys & Games - Amazon.co.uk
#=> https://www.amazon.co.uk/Toys-Games-Harry-Potter/s?rh=n%3A468292%2Cp_89%3AHarry+Potter
<块引用>

免责声明,我为 SerpApi 工作。