Ruby 如何解决“问题”;“未定义的方法”;当试图用Nokogiri刮去一个网站时

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

我想用这个刮板从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
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"