Нокогири извлекает данные из xml - PullRequest
2 голосов
/ 04 марта 2011

Я пытаюсь извлечь данные из приложения XML в rails с помощью драгоценного камня Nokogiri,

XML :

<item>
    <description>
        <![CDATA[<img src="something" title="anothething">
        <p>text, bla bla...</p>]]>
    </description>
</item>

На самом деле я делаю что-то подобноеизвлечь данные из xml:

def test_content
    @return = Array.new
    site = 'http://www.les-encens.com/modules/feeder/rss.php?id_category=0'
    @doc = Nokogiri::XML(open(site, "UserAgent" => "Ruby-OpenURI"))
    @doc.xpath("//item").each do |n|
        @return << [
            n.xpath('description')
        ] 
   end
end

Не могли бы вы показать мне, как извлечь только атрибут src из тега img ?

Изменить: Я должен заменить XML на правильный.

Ответы [ 2 ]

6 голосов
/ 07 марта 2011

Результатом вызова xpath, сделанного в Nokogiri, будет NodeSet , который представляет собой просто список Nokigiri Nodes

Имея это в виду, мы можем просто взять примеры из документации по Нокогири и адаптировать их.

Чтобы ответить на ваш вопрос, «Не могли бы вы показать мне, как извлечь только атрибут src из тега img?» , вот один из таких способов.

#the 'open' method here is part of the open-uri library
xml = Nokogiri::XML(open(your_url_here))

all_images = xml.xpath("//img") #returns NodeSet (list of Nokogiri Nodes)

image_sources = []

#iterate through each node
all_images.each() do |node|
  image_sources << node.get_attribute('src') #One method
  #image_sources << node['src'] #Another convention we could use
end

Как отмечает Phrogz ниже, более нелепым способом извлечения атрибута 'src' из всех узлов изображений является непосредственное сопоставление атрибута 'src', а не итерация и вставка в массив.

image_sources = all_images.map{ |node| node['src'] }
1 голос
/ 08 марта 2011

Мой код решения, спасибо @Douglas и @Phrogz

def test_content
    site = 'xml-link'
    # On lit le xml généré par le site
    xml = Nokogiri::XML(open(site, "UserAgent" => "Ruby-OpenURI"))
    # On le converti en html
    xml = xml.to_html
    # On le lit a nouveau
    html = Nokogiri::HTML(xml)
    # on extrait les images
    @images = html.xpath('//img')
    # on stock leurs sources dans un tableau
    @images_sources = @images.map{|node| node['src']}
end
...