Вытащить URL из канала с помощью Nokogiri - PullRequest
1 голос
/ 15 августа 2011

Допустим, у меня есть это в документе:

<entry>
  <link rel="replies" type="application/atom+xml" href="http://www.url.com/feeds/1/comments/default" title="Comments"/>
  <link rel="alternate" type="text/html" href="http://www.url.com/a_blog_post.html" title="A Blog Post"/>
</entry>

<entry>
  <link rel="replies" type="application/atom+xml" href="http://www.url.com/feeds/2/comments/default" title="Comments"/>
  <link rel="alternate" type="text/html" href="http://www.url.com/another_blog_post.html" title="Another Blog Post"/>
</entry>

Я пытаюсь использовать Nokogiri, чтобы получить URL-адреса для каждого из сообщений в блоге, но, очевидно, я все делаю неправильно (яЯ новичок в программировании и не могу понять нокогири)

Вот что у меня есть:

require 'nokogiri'
require 'open-uri'

def get_posts(url)
  posts = []
  doc = Nokogiri::HTML(open(url))
  doc.css('entry.alternate').each do |e|
    puts e['href']
    posts << e['href']
  end
  return posts
end 

puts "Enter feed url:"
url = gets.chomp
posts = get_posts(url)
puts posts.to_s

Любая помощь будет отличной!Я начал эту маленькую вещь, чтобы лучше учиться программировать, но я застрял.Мой вывод в настоящее время []

Ответы [ 3 ]

3 голосов
/ 15 августа 2011

Ваш CSS-селектор неверен, entry.alternate выберет все элементы ввода с альтернативным классом (что-то вроде <entry class="alternate" />).

Полагаю, вы хотите выбрать все элементы link, имеющие атрибут rel со значением alternate. CSS-селектор для этого link[rel=alternate]. Поэтому измените свой код следующим образом:

doc.css('link[rel=alternate]').each do |e|
  puts e['href']
  posts << e['href']
end

Подробнее о селекторах CSS можно прочитать здесь: http://www.w3.org/TR/CSS2/selector.html.

1 голос
/ 15 августа 2011

Если вам нужен только атрибут href для ссылок, обратите внимание, что вы можете сделать это проще:

def get_posts(url)
  Nokogiri::XML(open(url))
    .xpath('//link[@rel="alternate"]/@href')
    .map(&:value)
end 

Выше XPath выбирает не элементы link, а атрибуты href для этихэлементы;map затем превращает этот массив объектов Nokogiri::XML::Attr в массив только их значений (в виде строк).Поскольку это последнее выражение в методе, массив является возвращаемым значением.

1 голос
/ 15 августа 2011

Попробуйте с doc.xpath "//entry/link[@rel='alternate']" вместо doc.css('entry.alternate'). У меня это работает.

...