2014-10-01 2 views
0

Я изо всех сил, чтобы вернуть результаты, используя это:комплекс петля с 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 = "http://www.mollymaid.co.uk/counties/aberdeenshire.aspx" 
doc = Nokogiri::HTML(open(url)) 
puts doc.at_css(".city_odd").text 

, но я не понимаю, как перебрать все результаты особенно Theres в .city_even CSS тег, что мне нужно добавить туда. Если я вставляю это, он просто игнорируется.

Кроме того, я хочу удалить текст «- Обслуживается MOLLY MAID Aberdeen» из результатов. Каждая строка данных отображается как «Altens Ind Estate - обслуживается MOLLY MAID Aberdeen». Будет ли здесь chomp?

В идеальном мире я хотел бы автоматически пройти весь этот список, делая то же самое, хотя я не уверен, что это возможно? http://www.mollymaid.co.uk/servicelist.aspx

+0

Вам нужно добавить небольшой, уменьшенный образец, из HTML в вопросе, вместо того, чтобы просить нас, чтобы получить его и посмотреть через него. Помните, вы просите людей взять свое свободное время, чтобы помочь вам, поэтому вам должно быть как можно проще сделать это. Другими словами, помогите нам помочь вам. –

+0

Вы пропустили '.' в' .city_even' – pguardiario

ответ

-1

Вместо этого я бы использовал 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 вслух, это означает: найти все дивы в документе, которые имеют класс атрибут равен «city_even» или «city_odd», а затем найти все теги анкерные которые являются дочерними элементами этих div, затем найдите все текстовые узлы, являющиеся дочерними элементами этих якорных тегов.

Когда Nokogiri возвращается с NodeSet, содержащим названия городов, этот код повторяется через каждое название города и puts.

+0

Thats brilliant thanks! Просто нужно понять, что все это значит сейчас! – user3735114

+0

Когда я изучал xpath, я нашел этот учебник действительно полезным: http://zvon.org/xxl/XPathTutorial/General/examples.html – thohl

+0

Но если вы читаете его вслух слева направо, этот конкретный xpath означает что-то вроде «найти все div в документе, у которых есть атрибут класса, равный« city_even »или« city_odd », а затем найти все теги привязки, которые являются дочерними элементами этих div, а затем найти все текстовые узлы, являющиеся дочерними элементами этих якорных тегов». – thohl

0

Я не вижу контейнер .location для .city_even и .city_odd. Попробуйте вместо этого используя #city_list 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 внутри city_even/city_odd:

doc.css("#city_list").each do |city| 
    city1 = city.css(".city_odd a").text 
    city2 = city.css(".city_even a").text 

    puts city1 
    puts city2 
end 
+0

Почти работал, но получил эту ошибку: Danestone - Обслуживается MOLLY MAID Aberdeen testscrape.rb: 8: in 'block in

': undefined method' text' for nil: NilClass (NoMethodError) \t из /Users/user/.rvm/gems/ruby-2.1.2/gems/nokogiri-1.6.3.1/lib/nokogiri/xml/node_set.rb: 237: в блоке в каждом \t из /Users/user/.rvm/gems/ruby-2.1.2/gems/nokogiri-1.6.3.1/lib/nokogiri /xml/node_set.rb:236: в 'upto ' \t из /Users/user/.rvm/gems/ruby-2.1.2/gems/nokogiri-1.6.3.1/lib/nokogiri/xml/node_set.rb: 236: in 'each ' \t от testscrape.rb: 7: in'
' localhost: пользователь рабочего пространства $ – user3735114

+0

Я верю, что '# at_css' ищет первое вхождение и возвращает узел. Попробуйте просто '# css'. – thohl

+0

Попытайтесь увидеть, что такое 'city', и посмотрите, можете ли вы называть' css' на нем, как @thohl. Если это не сработает, 'puts city.content' должен вывести HTML-код – SuckerForMayhem

0
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 

Это то, что вы хотите, т. Е. Распечатать текст всех ссылок? Поскольку элементы div#city_list (если HTML был правильным, там должно быть только одно), на этой странице содержатся только ссылки и текст, который вы хотите удалить.

Кстати, я рекомендую использовать версию 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' 
+0

«cat aberdeenshire.aspx | nokogiri -e» помещает $ _. Css («. City_odd a, .city_even a»). Map &: text '"Ugh. Вместо этого используйте: 'nokogiri -e 'помещает $ _. Css (". City_odd a, .city_even a "). Map &: text'

+0

Спасибо, @theTinMan. Обычно я предпочитаю версию 'cat', потому что она идет слева направо. – PSkocik

+0

Использование 'cat' для подключения к приложению, которое читает STDIN, обсуждалось много раз по всем сетям. Хотя логично читать, это также неэффективно. Придерживайтесь этой операции в середине цикла и делайте это несколько миллионов раз, и вы будете говорить о различиях в реальном времени. Это трудная привычка ломаться, но осознание проблем помогает. –

Смежные вопросы