Как найти URL-адрес ссылки по тексту ссылки с помощью XPath?

У меня есть хорошо сформированная страница XHTML. Я хочу найти целевой URL-адрес ссылки, когда у меня есть текст, на который есть ссылка.

Пример

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

Мне нужно такое выражение XPath, что если задано programming questions site, оно даст http://stackoverflow.com, а если я передам ему news, даст http://cnn.com.


person flybywire    schedule 27.05.2009    source источник


Ответы (6)


Должно быть что-то похожее на:

//a[text()='text_i_want_to_find']/@href
person Badaro    schedule 27.05.2009
comment
я когда-нибудь выучу xpath? когда я вижу запрос, он такой очевидный и простой для понимания... но я никогда не смогу написать его самостоятельно - person flybywire; 27.05.2009
comment
@flybywire Если вы читаете этот бесплатный курс «Введение в базы данных» Стэнфордского университета, в нем есть хороший раздел, посвященный XML и XPath. - person James P.; 28.06.2012
comment
Вместо text() можно использовать .=, например //a[.='Зарегистрироваться здесь'] - person danpop; 03.02.2016
comment
А если я не знаю текста? Могу ли я выбрать узлы, которые содержат http или определенное ключевое слово? - person Alston; 29.07.2018

Слишком поздно для вас, но для тех, кто с тем же вопросом...

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

Конечно, «программированием» может быть любой текстовый фрагмент.

person MaDeuce    schedule 23.05.2011
comment
Этот более общий. Хорошая акция - person Aaron Gillion; 13.06.2015
comment
Это чувствительно к регистру. Могу ли я игнорировать случай здесь? - person user3060430; 03.10.2020

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

который в основном идентифицирует узел привязки <a>, который имеет нужный текст, и извлекает атрибут href.

person Brian Agnew    schedule 27.05.2009

Думайте о фразе в квадратных скобках как о предложении WHERE в SQL.

Таким образом, этот запрос говорит: «Выберите атрибут «href» (@) тега «a», который появляется где угодно (//), но только там, где (фраза в квадратных скобках) текстовое содержимое тега «a» равно ' сайт вопросов по программированию».

person Baxter Tidwell    schedule 27.05.2009
comment
Привет, Питер, у тебя есть какой-нибудь учебный сайт для изучения запроса xpath? - person Karim Narsindani; 20.02.2015

Для нечувствительного к регистру содержимого используйте следующее:

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

translate преобразует заглавные буквы в слове ПРОГРАММИРОВАНИЕ в строчные буквы.

person Abdo    schedule 03.01.2013
comment
Пожалуйста, не добавляйте спасибо в качестве ответов. Потратьте некоторое время на сайт, и вы получите достаточно привилегий, чтобы голосовать за ответы, которые вам нравятся, что является способом выражения благодарности Stack Overflow. - person Sklivvz; 30.06.2013
comment
Спасибо, это был не мой ответ. В некотором смысле я отдал должное ответу выше, который я улучшил. - person Abdo; 01.07.2013

если вы используете пакет гибкости html, используйте getattributeValue:

$doc2.DocumentNode.SelectNodes("//div[@class='className']/div[@class='InternalClass']/a[@class='InternalClass']").GetAttributeValue("href","")
person Miguel Vaz    schedule 13.10.2012