Ruby 如何解决“问题”;“未定义的方法”;当试图用Nokogiri刮去一个网站时
我想用这个刮板从HMs网站上获取一些数据:Ruby 如何解决“问题”;“未定义的方法”;当试图用Nokogiri刮去一个网站时,ruby,nokogiri,scrape,Ruby,Nokogiri,Scrape,我想用这个刮板从HMs网站上获取一些数据: require 'nokogiri' require 'open-uri' require 'rmagick' require 'mechanize' product = "http://www2.hm.com/es_es/productpage.0250933004.html" web = Nokogiri::HTML(open(product)) puts web.at_css('.product-item-headline').text No
require 'nokogiri'
require 'open-uri'
require 'rmagick'
require 'mechanize'
product = "http://www2.hm.com/es_es/productpage.0250933004.html"
web = Nokogiri::HTML(open(product))
puts web.at_css('.product-item-headline').text
Nokogiri为每个选择器返回NIL,并为nilClass引发未定义的方法。我不知道这个网站是否有可以避免刮擦的东西
在URL DOM中,我可以看到有一个.product item headline
类,我可以在JavaScript控制台中获取信息,但我不能使用Nokogiri
我试着瞄准整个正文,这是我唯一得到的印刷品
var callcoremetrix = function(){cmSetClientID(getCoremetricsClientId(), true, "msp.hm.com", "hm.com");};
也许是一些JavaScript毁了我的生活?一个想法是使用IRB并一步一步地进行:
irb
> require 'open-uri'
> html = open(product).read
HTML是否包含类名文本
> html =~ /product-item-headline/
=> 56099
是的,是这样的,这是一句话:
<h1 class="product-item-headline">
阅读HTML文本,尝试与您的问题相关的越来越广泛的查询,使您更接近HTML的顶部,看看他们是否找到了结果:
web.css("h1") # on line 2217 of the HTML
=> []
web.css(".product-detail-meta") # on line 2215
=> []
web.css(".wrapper") # on line 86
=> []
web.css("body") # on line 84
=> [#<Nokogiri::XML::Element …
没有。所以我们重复这个过程,减少HTML
我还喜欢通过删除我知道不包含我的目标的部分来减少HTML,例如
区域、
区域、
区域等
您可能喜欢使用自动缩进编辑器,因为它可以快速向您显示HTML不平衡的地方
最终我们发现HTML中有许多不正确的标记,例如未关闭的部分标记
您可以通过多种方式解决此问题:
- 纯粹的方法是修复未关闭的节标记,任何您想要的方式
- 黑客的方法是将HTML缩小到您知道需要的区域,即h1标记中
以下是黑客攻击方式:
area = html.match(/<h1 class="product-item-headline\b.*?<\/h1>/m)[0]
web = Nokogiri::HTML(area)
puts web.at_css(".product-item-headline").text.strip
=> "Funda de cojín de jacquard"
area=html.match(/打开一个IRB会话,一步一步地进行。甚至可能将HTML写入文件。仅仅因为DOM有一些东西并不意味着它在源代码中,您正在向Nokogiri提供信息。问题是,如果我尝试用Nokogiri的URL在IRB中打开,它会认为它是一个文件:Errno::Enoint:没有这样的文件或目录-您需要要求“打开uri”
,等等。首先,我仍然在IRB上收到相同的错误…IRB(主):005:0>将web.at_css(“.product item headline”).text NoMethodError:nil:nilclass的未定义方法“text”是的,我尝试将整个身体作为目标,但只打印了一个JS。也许在使用Nokogiri之前删除所有JS?Nokogiri可以很容易地判断HTML/XML是否有问题。解析文档后,如doc=Nokogiri::HTML(…)
use。
web.css("h1") # on line 359 of the HTML
=> []
area = html.match(/<h1 class="product-item-headline\b.*?<\/h1>/m)[0]
web = Nokogiri::HTML(area)
puts web.at_css(".product-item-headline").text.strip
=> "Funda de cojín de jacquard"