Ruby 带Nokogiri的复杂回路

Ruby 带Nokogiri的复杂回路,ruby,nokogiri,Ruby,Nokogiri,我正在努力使用以下方法返回结果: url = "http://www.mollymaid.co.uk/counties/aberdeenshire.aspx" doc = Nokogiri::HTML(open(url)) doc.css(".location").each do |location| puts location.at_css(".city_odd, city_even").text end 这只是试图从上面的URL获取结果。我可以将其更改为仅返回一个结果: url =

我正在努力使用以下方法返回结果:

url = "http://www.mollymaid.co.uk/counties/aberdeenshire.aspx"

doc = Nokogiri::HTML(open(url))
doc.css(".location").each do |location|
  puts location.at_css(".city_odd, city_even").text
end 
这只是试图从上面的URL获取结果。我可以将其更改为仅返回一个结果:

url = "http://www.mollymaid.co.uk/counties/aberdeenshire.aspx"
doc = Nokogiri::HTML(open(url))
puts doc.at_css(".city_odd").text
但是我不知道如何迭代所有的结果,特别是因为我需要在其中添加一个.city_甚至CSS标记。如果我也插入这个,它就会被忽略

此外,我想从结果中删除由MOLLY MAID Aberdeen提供服务的文本。每行数据显示为Altens Ind Estate,由MOLLY MAID Aberdeen提供服务。chomp在这里正确吗

在一个理想的世界里,我想自动浏览所有列表,做同样的事情,尽管我不确定这是否可行

我没有看到.city\u偶数和.city\u奇数的.location容器。尝试改用city_list ID,该ID应为类,而不是可能有效的ID:

doc.css("#city_list").each do |city|
  city1 = city.css(".city_odd").text
  city1 = city1[0, city1.index(" - Serviced by")]
  city2 = city.css(".city_even").text
  city2 = city2[0, city2.index(" - Serviced by")]

  puts city1
  puts city2
end
或者更好的方法是,只在城市内部获得a(偶数/奇数):

我会改用xpath,因为它更具表现力。下面是一个工作示例:

url = "http://www.mollymaid.co.uk/counties/aberdeenshire.aspx"

doc = Nokogiri::HTML(open(url))
doc.xpath("//div[@class='city_even' or @class='city_odd']/a/text()").each do |location|
    puts location
end
如果您大声阅读xpath表达式,这意味着:在文档中查找class属性等于“city_偶数”或“city_奇数”的所有div,然后查找属于这些div的所有锚定标记,然后查找属于这些锚定标记的所有文本节点

当Nokogiri返回一个包含城市名称的节点集时,这段代码遍历每个城市名称并将其放入

这是你想要的吗,即打印所有链接的文本?因为如果HTML是正确的,divcity_列表元素应该只有一个在该页面上,只包含链接和要删除的文本

顺便说一下,我建议使用Nokogiri的命令行版本来测试CSS。您应该通过以下方式获得更快的反馈周期:

wget http://www.mollymaid.co.uk/counties/aberdeenshire.aspx 
cat aberdeenshire.aspx  | nokogiri -e 'puts $_.css(".city_odd a, .city_even a").map &:text'

几乎可以工作,但出现了以下错误:Danestone-由MOLLY MAID Aberdeen TestScrap.rb:8:in block-in提供服务:nil:NilClass NoMethodError from/Users/user/.rvm/gems/ruby-2.1.2/gems/nokogiri-1.6.3.1/lib/nokogiri/xml/node_set.rb:237:in block-in-in-in-in-in-from/Users/user/.rvm/gems/ruby-2.1.2/gems/nokogiri-1.6.3.1/lib/nokogiri/xml/node_set.rb:236:in-upto'from/Users/user/.rvm/gems/ruby-2.1.2/gems/nokogiri-1.6.1/lib/nokogiri/node_set.rb:236:in每个“from testscrap.rb:7:in”localhost:workspace用户$我相信at_搜索第一次出现并返回一个css节点。试试css,看看城市是什么,看看你是否可以像@thohl建议的那样调用css。如果这不起作用,puts city.content应该输出有效的HTMLHey thohl-有什么想法吗-由MOLLY MAID Aberdeen提供服务的结果吗?str=city.css.city\u odd.text和str[0,str.index-Serviced by]应该做一些小的、简化的HTML示例,而不是要求我们检索它并查看它。记住,你要求人们利用他们的空闲时间来帮助你,所以你应该让他们尽可能容易地这样做。换句话说,帮助我们,帮助你,你错过了一次机会。在城市里,非常感谢!现在就得弄清楚这意味着什么!当我学习xpath时,我发现本教程非常有用:但是如果你从左到右大声朗读,特定的xpath意味着查找文档中所有类属性等于“city_偶数”或“city_奇数”的div,然后查找这些div的子类的所有锚定标记,然后找到所有的文本节点,这些节点都是锚定标签的子节点。我在这个答案上得到了一些反对票,但是没有一个反对票的人停下来解释他们反对投票的原因。为什么是那些投反对票的人?是的,他们完全发挥了作用,真的帮助了我。我不确定这个地方是否真的管用,似乎有很多人并没有真正帮助人们——不是吗;这不是它的目的吗?cat aberdeenshire.aspx | nokogiri-e'puts$uu.css.city_奇数a、.city_偶数a.map&:text'Ugh。改为使用:nokogiri-e'puts$\.css.city\\奇数a、.city\\偶数a.map&:text'require 'open-uri' require 'nokogiri' url = "http://www.mollymaid.co.uk/counties/aberdeenshire.aspx" doc = Nokogiri::HTML(open(url)) puts doc.css(".city_odd a, .city_even a").map &:text
wget http://www.mollymaid.co.uk/counties/aberdeenshire.aspx 
cat aberdeenshire.aspx  | nokogiri -e 'puts $_.css(".city_odd a, .city_even a").map &:text'