0

私はnokogiriを使用してlast.fmからのXML応答を解析しています。現在、必要な情報を返していますが、希望する形式ではありません。私が得たのは、1つのNokogiri::XMLドキュメントのように見えるものです。私が欲しいのは<track>、曲のタイトル、アーティスト、URLを含む行ごとです。XMLのサンプルは次のとおりです。

<lfm status="ok">
  <toptracks metro="Beijing" page="1" perPage="50" totalPages="10" total="500">
    <track rank="1">
      <name>Rolling in the Deep</name>
      <duration>226</duration>
      <listeners>33</listeners>
      <mbid>092a88bc-af0b-4ddd-a3a1-17ad37abfccb</mbid>
      <url>
        http://www.last.fm/music/Adele/_/Rolling+in+the+Deep
      </url>
      <streamable fulltrack="0">1</streamable>
      <artist>
        <name>Adele</name>
        <mbid>1de93a63-3a9f-443a-ba8a-a43b5fe0121e</mbid>
        <url>http://www.last.fm/music/Adele</url>
      </artist>
      <image size="small">http://userserve-ak.last.fm/serve/34s/55125087.png</image>
      <image size="medium">http://userserve-ak.last.fm/serve/64s/55125087.png</image>
      <image size="large">http://userserve-ak.last.fm/serve/126/55125087.png</image>
      <image size="extralarge">
        http://userserve-ak.last.fm/serve/300x300/55125087.png
      </image>
    </track>
  </toptracks>
</lfm>

そして、これが私が使用しているコードです:

doc = Nokogiri::HTML(open(url))

doc.xpath("//toptracks").each do |track|
  song_title = track.xpath("*/name").text
  song_lastfm_url = track.xpath("*/url").text
  song_artist = track.xpath("*/artist/name").text

  puts "#{song_title} - #{song_lastfm_url} - #{song_artist}"
end

前述したように、すべての曲のタイトル、すべての曲のURL、すべての曲のアーティストが1つのXMLドキュメントとして取得されています。

4

1 に答える 1

2

自分が思っているようにトラックを反復していません。次のようにしてみてください。

doc.xpath('//toptracks/track').each do |track|
  song_title, song_lastfm_url, song_artist = track.xpath('./name','./url','./artist/name').map{|x| x.text.strip}
end
于 2012-06-22T03:56:43.927 に答える