Як я можу знайти 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.
James P.

4
Замість тексту () ви можете використовувати ". =", Наприклад //a[.= 'Зареєструватися тут']
danpop

1
Що робити, якщо я не знаю тексту? Чи можу я вибрати вузли, що містять httpабо певне ключове слово?
Алстон,

77

Занадто пізно для вас, але для будь-кого іншого з тим самим питанням ...

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

Звичайно, «програмуванням» може бути будь-який фрагмент тексту.


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
"Дякую" - не моя "відповідь". Я певним чином похвалив відповідь вище, яку я вдосконалив.
Абдо

1

якщо ви використовуєте html pack agility, використовуйте getattributeValue:

$doc2.DocumentNode.SelectNodes("//div[@class='className']/div[@class='InternalClass']/a[@class='InternalClass']").GetAttributeValue("href","")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.