Retira o nome do atributo do conjunto de resultados?

2

Eu tenho um documento HTML que parece (quando simplificado demais) assim:

<html>
  <body>
    <a href="...">...</a>
    <a href="...">...</a>
    <a href="...">...</a>
    ...
  </body>
</html>

O que eu gostaria de fazer seria extrair as URLs na saída delimitada por linhas. Digite xmllint:

$ xmllint --html --xpath //a/@href
href="..." href="..." href="..."

Ele está recebendo o atributo, o atributo inteiro incluindo o nome, e está exibindo-os delimitados por espaços. Como posso obter apenas uma lista de linhas com os valores do atributo href ? Eu quero uma saída assim:

...
...
...

em que ... é o URL encontrado no atributo href de cada elemento a .

Como posso formatar esta saída corretamente?

    
por Naftuli Kay 29.04.2015 / 19:15

2 respostas

1

Dada file.html :

<html>
  <body>
    <a href="url1">link text 1</a>
    <a href="url2">link text 2</a>
    <a href="url3">link text 3</a>
    ...
  </body>
</html>

Podemos usar pipes Unix para enviar a saída de xmllint , para sed e ver este resultado:

$ xmllint --html --xpath //a/@href input.html | sed 's/ href="\([^"]*\)"/\n/g'
url1
url2
url3

Explicação

Com xmllint sozinho, só recebemos:

$ xmllint --html --xpath //a/@href input.html
 href="url1" href="url2" href="url3"%
  • o trailing % indica que não há nova linha à direita

Um dos benefícios de sistemas semelhantes ao Unix é que podemos nos beneficiar do recurso Tubos de Doug McIlroy , Portanto, não precisamos que um programa tente fazer tudo. Na verdade, somos incentivados a combinar programas para atender às nossas necessidades.

Sendo assim, achando a saída de xmllint insatisfatória, canalizamos para combiná-la com o comando sed , que:

  • procura href="URL" units
  • usando o \( \) agrupamento para envolver a parte do URL
  • e substituí-lo por \n , de modo que ele faça referência ao grupo que definimos em torno do URL, além de adicionar uma nova linha depois da correspondência de

Dessa forma, combinamos xmllint e sed para obter a saída delimitada por linha desejada, uma URL por linha.

    
por 15.01.2016 / 23:51
0

Já pensou em usar o sed:

sed -n 's/.*href="\([^"]*\).*//p'

    
por 15.01.2016 / 20:08

Tags