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.

Respostas:


141

Deve ser algo semelhante a:

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

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.


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.


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 '".


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.


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","")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.