Como posso encontrar o URL do link pelo texto do link com XPath?

87

Tenho uma página XHTML bem formada . Quero encontrar o URL de destino de um link quando tiver o texto do link.

Exemplo

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

Eu quero uma expressão XPath tal que, se fornecida, programming questions siteela dará http://stackoverflow.come se eu der, newsela dará http://cnn.com.

flybywire
fonte

Respostas:

141

Deve ser algo semelhante a:

// a [text () = 'text_i_want_to_find'] / @ href
Badaro
fonte
73
algum dia vou aprender xpath? quando vejo uma consulta, ela é tão óbvia e fácil de entender ... mas nunca consigo escrever uma sozinha
flybywire
4
@flybywire Se você leu este curso grátis de introdução aos bancos de dados de Stanford, tem uma boa seção sobre XML e XPath.
James P.
4
Em vez de text (), você pode usar ". =", Por exemplo //a[.='Registre-se aqui ']
danpop
1
E se eu não souber o texto? Posso selecionar os nós que contém httpou determinada palavra-chave?
Alston
75

Tarde demais para você, mas para qualquer outra pessoa com a mesma pergunta ...

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

Claro, 'programação' pode ser qualquer fragmento de texto.

MaDeuce
fonte
1
Este é mais generalizado. Boa parte
Aaron Gillion
9
//a[text()='programming quesions site']/@href 

que basicamente identifica um nó âncora <a>que tem o texto desejado e extrai o hrefatributo.

Brian Agnew
fonte
6

Pense na frase entre colchetes como uma cláusula WHERE no SQL.

Portanto, esta consulta diz, "selecione o atributo" href "(@) de uma tag" a "que aparece em qualquer lugar (//), mas apenas onde (a frase entre colchetes) o conteúdo textual da tag" a "é igual a ' site de perguntas de programação '".

Baxter Tidwell
fonte
Oi Peter, você tem algum site de tutorial para aprender a consulta xpath?
Karim Narsindani
4

Para contém sem distinção entre maiúsculas e minúsculas, use o seguinte:

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

traduzir converte letras maiúsculas em PROGRAMAÇÃO para programação em minúsculas.

Abdo
fonte
Por favor, não adicione "obrigado" como respostas. Invista algum tempo no site e você obterá privilégios suficientes para votar positivamente nas respostas de que gosta, que é a maneira do Stack Overflow de dizer obrigado.
Sklivvz
5
"Obrigado" não foi minha "resposta". Eu estava, de certa forma, dando crédito a uma resposta acima que melhorei.
Abdo
1

se você estiver usando o pacote de agilidade html, use getattributeValue:

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