Burada bir tuhaflık örneği var:Bir XML belgesini ayrıştırmak ve döndürmek için Nokogiri'yi nasıl alabilirim?
#!/usr/bin/ruby
require 'rubygems'
require 'open-uri'
require 'nokogiri'
print "without read: ", Nokogiri(open('http://weblog.rubyonrails.org/')).class, "\n"
print "with read: ", Nokogiri(open('http://weblog.rubyonrails.org/').read).class, "\n"
Bu döndürmeyi döndürür:
without read: Nokogiri::XML::Document
with read: Nokogiri::HTML::Document
read
olmadan XML döndürür ve HTML ile mi? Web sayfası "XHTML geçişi" olarak tanımlanmıştır, bu yüzden ilk önce Nokogiri'nin OpenURI'nin "içerik türü" ni akıştan okuması gerektiğini düşünmüştüm, ancak 'text/html'
:
(rdb:1) doc = open(('http://weblog.rubyonrails.org/'))
(rdb:1) doc.content_type
"text/html"
değerini döndürüyor. . Şimdi, Nokogiri'nin neden iki farklı değer döndürdüğünü anlamaya çalışıyorum. Metnin ayrıştırılması ve içeriğin HTML mi yoksa XML mi olduğunu belirlemek için buluşsal yöntemler kullanmıyor gibi görünmektedir.
Aynı şey bu sayfa tarafından işaret edilen ATOM besleme ile gerçekleşiyor:
(rdb:1) doc = Nokogiri.parse(open('http://feeds.feedburner.com/RidingRails'))
(rdb:1) doc.class
Nokogiri::XML::Document
(rdb:1) doc = Nokogiri.parse(open('http://feeds.feedburner.com/RidingRails').read)
(rdb:1) doc.class
Nokogiri::HTML::Document
Önceden ne olduğunu bilmeden bir sayfayı ayrıştırabilmem gerekir. veya ATOM) ve güvenilir olduğunu belirler. Nokogiri'den bir HTML veya XML besleme dosyasının gövdesini ayrıştırmasını istedim, ancak bu tutarsız sonuçları görüyorum.
Ben türünü belirlemek için bazı testler yazabileceğimi düşündüm ama sonra elementleri bulamayan xpaths'e rastladım ama normal aramalar:
(rdb:1) doc = Nokogiri.parse(open('http://feeds.feedburner.com/RidingRails'))
(rdb:1) doc.class
Nokogiri::XML::Document
(rdb:1) doc.xpath('/feed/entry').length
0
(rdb:1) doc.search('feed entry').length
15
Ben xpaths XML ile çalışacağını düşündüm ama sonuçlar ya güvenilir görünmek.
Bu testlerin hepsi Ubuntu kutumda yapıldı, ancak Macbook Pro'mda da aynı davranışı gördüm. Yanlış bir şey yaptığımı öğrenmeyi çok isterdim, ancak bana tutarlı sonuçlar veren ayrıştırma ve arama için bir örnek görmedim. Kimse bana yollarımın hatasını gösterebilir mi?
İronik bu aslında bir soru ... –