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

88

У меня хорошо сформированная страница 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.

облет
источник

Ответы:

141

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

// a [text () = 'text_i_want_to_find'] / @ href
Бадаро
источник
73
я когда-нибудь выучу xpath? когда я вижу запрос, он настолько очевиден и прост для понимания ... но я никогда не могу написать его самостоятельно
flybywire
4
@flybywire Если вы читали этот бесплатный курс Стэнфордского университета «Введение в базы данных», там есть хороший раздел по XML и XPath.
Джеймс П.
4
Вместо text () вы можете использовать «. =», Например //a[.='Зарегистрируйтесь здесь ']
danpop
1
Что делать, если я не знаю текста? Могу ли я выбрать узлы, содержащие httpопределенное ключевое слово?
Alston
77

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

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

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

MaDeuce
источник
1
Этот более общий. Хорошая
публикация
Это чувствительно к регистру. Могу я здесь проигнорировать случай?
user3060430
9
//a[text()='programming quesions site']/@href 

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

Брайан Агнью
источник
6

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

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

Бакстер Тидвелл
источник
Привет, Питер, есть ли у вас какой-нибудь учебный сайт для изучения запросов xpath?
Карим Нарсиндани
4

Если регистр нечувствителен к регистру, используйте следующее:

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

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

Абдо
источник
Пожалуйста, не добавляйте «спасибо» в качестве ответа. Потратьте некоторое время на сайт, и вы получите достаточные привилегии, чтобы голосовать за понравившиеся ответы, что является способом поблагодарить вас за переполнение стека.
Sklivvz
5
«Спасибо» не было моим «ответом». Я в некотором роде отдавал должное приведенному выше ответу, который улучшил.
Abdo
1

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

$doc2.DocumentNode.SelectNodes("//div[@class='className']/div[@class='InternalClass']/a[@class='InternalClass']").GetAttributeValue("href","")
Мигель Ваз
источник