2016-06-24 125 views
5

Biraz karmaşık bir XPath sorununa rastladım. Bir web sayfasında (I Imgur kullanılan ve bazı metin değiştirildi) bir kısmının bu HTML düşünün:XPath görüntü bağlantılarını seç - img src'nin yalnızca varsa href bağlantısı, başka bir deyişle img src bağlantısını seç

<a href="//i.imgur.com/ahreflink.jpg" class="zoom"> 
    <img class="post-image-placeholder" src="//i.imgur.com/imgsrclink.jpg"> 
    </img> 
</a> 

Ben her şeyden önce img etiketleri belgede ve onların src es tekabül bulma aramak istiyorum. Ardından, img src bağlantısının bir görüntü dosyası uzantısı (.jpeg, .jpg, .gif, .png) içerip içermediğini kontrol etmek istiyorum. Bir resim uzantısı içermiyorsa, kapma. Bu durumda bir görüntü uzantısı var. Şimdi kapmak istediğimiz bağlantıyı bulmak istiyoruz. parent href bulunduğundan, ilgili linki almalıyız.

Sonucu İstenilen: //i.imgur.com/ahreflink.jpg

Ama şimdi en parent href yok diyelim:

<a name="missing! oh no!"> 
    <img class="post-image-placeholder" src="//i.imgur.com/imgsrclink.jpg"> 
    </img> 
</a> 

İstenilen Sonucu: Bu XPath oluşturma hakkında gitmek nasıl //i.imgur.com/imgsrclink.jpg

? Eğer yardımcı olursa, ben de XPath ile Python (Scrapy) kullanıyorum. Yani problemin ayrılması gerekiyorsa, Python da kullanılabilir.

+0

Şimdiye kadar bir şey denediniz mi? –

+0

Sadece bağlantıların görüntü uzantılarını kontrol ettiğim kısma girdim, ama hangi bağlantıyı alacağımı seçmek konusunda kafam karıştı. – dtgee

+0

Tamamen XPath kullanarak sonuca ulaşmak ve denemek ister misiniz, yoksa mantığın bir kısmını uygulayabileceğiniz bir betik diliniz var mı? –

cevap

4

Bu, tek xpath ifadede yapmak çok basittir:

//a[not(@href)]/img/@src | //a[img]/@href 
+0

Vay canına, img src'ye öncelik vermeyi asla düşünmedim (mantıklı değil) çünkü önce href'i önceliklendiriyoruz. İlk önce denemek zorunda olsa da umut verici bir çözüm gibi görünüyor. – dtgee

+0

@dtgee Öncelik yok, sadece filtreler. – o11c

4

Tek bir XPath ifadesinde yapmanıza gerek yoktur. İşte görüntü uzatma çek atlayarak bir scrapy belirli uygulamasıdır (yorum bakılırsa, zaten anladım ettik):

images = response.xpath("//a/img") 
for image in images: 
    a_link = image.xpath("../@href").extract_first() 
    image_link = image.xpath("@src").extract_first() 

    print(a_link or image_link) 
+0

Ah, teşekkürler. Sanırım, her şeyi seçmek için XPath'ı kullanmak zorunda olduğumu düşünüyorum. Bu hatadan öğreneceğim! – dtgee

+0

@dtgee Muhtemelen * Yapma * Xpath içinde yapmak istiyorsanız, ağır kaldırma işlemini Python yerine C yerine tutmak için. – o11c

+0

Doğru. Python kullanmak kodu çok daha okunabilir hale getirir, ancak XPath kullanmayı ve bazı yorumları eklemenin aynı amaca hizmet etmesini sağlar. – dtgee