XPath ile bağlantı metnine göre bağlantı URL'sini nasıl bulabilirim?


88

İyi biçimlendirilmiş bir XHTML sayfam var. Bağlantılı metne sahip olduğumda bir bağlantının hedef URL'sini bulmak istiyorum.

Misal

<a href="http://stackoverflow.com">programming questions site</a>
<a href="http://cnn.com">news</a>

Bir istemek XPath verilirse bu ifade öyle programming questions siteo verecektir http://stackoverflow.comve bunu verirsem newso verecektir http://cnn.com.

Yanıtlar:


143

Şuna benzer bir şey olmalı:

// a [text () = 'text_i_want_to_find'] / @ href

75
hiç xpath öğrenecek miyim? bir sorgu gördüğümde çok açık ve anlaşılması kolay ... ama asla kendi
başıma yazamıyorum

4
@flybywire Stanford'un ücretsiz Veritabanlarına Giriş kursunu okuduysanız, XML ve XPath hakkında iyi bir bölüm var.
James P.

4
Text () yerine ". =" Kullanabilirsiniz, örneğin //a[.='Kayıt ol ']
danpop

1
Ya metni bilmiyorsam? httpAnahtar kelimeyi içeren veya belirli anahtar kelimeleri içeren düğümleri seçebilir miyim ?
Alston

78

Senin için çok geç, ama aynı soruyu soran herkes için ...

//a[contains(text(), 'programming')]/@href

Elbette, 'programlama' herhangi bir metin parçası olabilir.


1
Bu daha geneldir. İyi paylaşım
Aaron Gillion

Bu, büyük / küçük harfe duyarlıdır. Buradaki vakayı görmezden gelebilir miyim?
user3060430

9
//a[text()='programming quesions site']/@href 

temelde <a>istediğiniz metne sahip bir bağlantı düğümünü tanımlar ve hrefözniteliği çıkarır .


6

Köşeli parantez içindeki ifadeyi SQL'deki bir WHERE cümlesi olarak düşünün.

Dolayısıyla bu sorgu, herhangi bir yerde (//) görünen bir "a" etiketinin "href" özniteliğini (@) seçin, ancak yalnızca "a" etiketinin metin içeriğinin "a" programlama soruları sitesi '".


Merhaba Peter, xpath sorgusunu öğrenmek için herhangi bir öğretici siteniz var mı?
Karim Narsindani

4

Büyük / küçük harfe duyarlı olmayan içerirler için aşağıdakileri kullanın:

//a[contains(translate(text(),'PROGRAMMING','programming'), 'programming')]/@href

translate, PROGRAMLAMADA büyük harfleri küçük harf programlamaya dönüştürür.


Lütfen yanıt olarak "teşekkürler" ifadesini eklemeyin. Sitede biraz zaman ayırın ve beğendiğiniz yanıtları yükseltmek için yeterli ayrıcalıklara sahip olacaksınız, bu da Stack Overflow'a teşekkür etmenin yoludur.
Sklivvz

5
"Teşekkürler" benim "cevabım" değildi. Bir bakıma, üzerinde geliştirdiğim bir cevaba itibar ediyordum.
Abdo

1

html çeviklik paketi kullanıyorsanız getattributeValue kullanın:

$doc2.DocumentNode.SelectNodes("//div[@class='className']/div[@class='InternalClass']/a[@class='InternalClass']").GetAttributeValue("href","")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.