2011-05-21 27 views
10

kısmi eşleştirmesiyle alın Bir URL'den sonuçları görüntülemek için Nokogiri'yi kullanmaya çalışıyorum. (aslında bir URL’yi kazıyarak). Tüm öğeleri, sınıf özniteliği

<p class="mattFacer">Matty</p> 
<p class="mattSmith">Matthew</p> 
<p class="suzieSmith">Suzie</p> 

Öyleyse size kelime "mat" ile başlayan tüm unsurları bulmak gerekir:

Ben benzer bazı HTML var. Ne yapmak gerek .. Ben bir dahaki sefere referans böylece elemanın değeri ve öğe adını kaydetmek yani ben eleman yakalamak için nasıl çalışmamış

"Matty" and "<p class='mattFacer'>" 
"Matthew" and "<p class='mattSmith'>" 

yakalamak gerekir HTML, ama burada element için bugüne kadar ne var (O doesnt iş!) Bu almalısınız

doc = Nokogiri::HTML(open(url)) 
tmp = "" 
doc.xpath("[class*=matt").each do |item| 
    tmp += item.text 
end 

@testy2 = tmp 
+0

İyi soru, +1. Tam, kısa ve kolay tek liner XPath ifadesi çözümü için cevabımı görün. :) –

+0

Burada ray gören var mı? – Nakilon

cevap

15

başladığınız:

doc.xpath('//p[starts-with(@class, "matt")]').each do |el| 
    p [el.attributes['class'].value, el.children[0].text] 
end 
["mattFacer", "Matty"] 
["mattSmith", "Matthew"] 
+0

Evet - bu hile gibi görünüyor! Teşekkürler! Sınıf isminin herhangi bir kısmını aramak için bir yöntem var mı? Yani

+5

XPath, 'start-with 'gibi birçok işleve sahiptir, ör. 'içerir 've' substring '. http://www.w3.org/TR/xpath/#corelib –

+0

mükemmel - teşekkürler!Eşleştirmek için içerir() - mükemmel! –

2

Kullanım:

/*/p[starts-with(@class, 'matt')] | /*/p[starts-with(@class, 'matt')]/text() 

Bu XML belgesinin üst elemanın bir çocuk olan ve class nitelik "matt" ve bu tür p herhangi bir metin düğümü çocukla başlar değeridir herhangi p elemanlarını seçer öğesi.

(hiçbiri sağlandı!) Bu XML belgesi karşı değerlendirilmiştir:

<html> <p class="mattFacer">Matty</p> <p class="mattSmith">Matthew</p> <p class="suzieSmith">Suzie</p> </html> 

aşağıdaki düğümleri

(ayrı bir satırda) seçilir ve pozisyonu ile erişilebilir:

: Burada

<p class="mattFacer">Matty</p> Matty <p class="mattSmith">Matthew</p> Matthew 
hızlı bir XSLT doğrulama olduğunu
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:for-each select= 
    "/*/p[starts-with(@class, 'matt')] 
    | 
    /*/p[starts-with(@class, 'matt')]/text() 
    "> 
    <xsl:copy-of select="."/> 
    <xsl:text>&#xA;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

bu dönüştürme sonucu, aynı XML belgesi (yukarıda) üzerine uygulandığında, seçilen düğümlerin doğru sekansı, beklenen:

<p class="mattFacer">Matty</p> 
Matty 
<p class="mattSmith">Matthew</p> 
Matthew 
0

kabul yanıt büyük, ancak başka bir yaklaşım olur normal ifadeler aracılığıyla maç sağlayan, Nikkou kullanmaktır (XPATH fonksiyonları aşina olmama gerek kalmadan):

doc.attr_matches('class', /^matt/).collect do |item| 
    [item.attributes['class'].value, item.text] 
end 
0
doc = Nokogiri::HTML(open(url)) 
tmp = "" 
items = doc.css("p[class*=matt]").map(&:text).join 
+1

typo 'css (" p [class * = matt] ")' – hlcs

İlgili konular