Estou tentando usar grep e recortar para extrair URLs de um arquivo HTML. Os links são parecidos com:
<a href="http://examplewebsite.com/">
Outros sites têm .net
, .gov
mas eu suponho que eu poderia fazer o corte fora do ponto certo antes >
. Então, eu sei que posso usar grep e cut de alguma forma para cortar tudo antes de http e depois de .com, mas estou preso há um tempo.
shell-script
grep
string
cut
eltigre
fonte
fonte
<>
forças a serem vistas como uma tag HTML.Respostas:
Como eu disse no meu comentário, geralmente não é uma boa ideia analisar HTML com Expressões regulares, mas às vezes você pode se safar se o HTML que estiver analisando for bem-comportado.
Para obter apenas URLs que estão no
href
atributo de<a>
elementos, acho mais fácil fazê-lo em vários estágios. A partir dos seus comentários, parece que você deseja apenas o domínio de nível superior, não o URL completo. Nesse caso, você pode usar algo como isto:onde
source.html
é o arquivo que contém o código HTML para analisar.Este código imprimirá todos os URLs de nível superior que ocorrem como
href
atributo de qualquer<a>
elemento em cada linha. A-i
opção para o primeirogrep
comando é garantir que ele funcione nos elementos<a>
e<A>
. Eu acho que você também pode dar-i
ao segundogrep
para capturarHREF
atributos em maiúsculas , OTOH, eu prefiro ignorar HTML quebrado. :)Para processar o conteúdo de
http://google.com/
saída
Minha saída é um pouco diferente dos outros exemplos, pois sou redirecionado para a página australiana do Google.
fonte
://
aceitamos apenas caracteres antes do primeiro/
ou"
. Mas se você quiser ver a URL completa, altere esse comando paragrep -Eo '(http|https)://[^"]+
. Outra opção para essa linha égrep -Eo '(http|https)://[^?"]+'
que corta as opções de consulta. No entanto, essa variação ainda imprimirá URLs contidos em outro URL como parâmetro de consulta, mas eles serão impressos em uma linha separada.Não tenho certeza se você está limitado em ferramentas:
Mas regex pode não ser o melhor caminho a percorrer, como mencionado, mas aqui está um exemplo que reuni:
Saída:
Você também pode adicionar
\d
para capturar outros tipos de números.fonte
sort -u
?Se o seu grep suportar as expressões regulares Perl:
(?<=href=")
e(?=")
são expressões de busca para ohref
atributo. Isso precisa da-P
opção.-o
imprime o texto correspondente.Por exemplo:
Como de costume, não há garantia de que sejam URIs válidos ou que o HTML que você está analisando seja válido.
fonte
Como alternativa não regex , use pup :
Encontrará todos os
a
elementos que possuem umhref
atributo e exibirá o valor dohref
atributo.Para instalar
pup
, você precisa do Go (uma linguagem de programação):A vantagem desta solução é que ela não depende do HTML estar formatado corretamente .
fonte
pup
, na hora de instalar que ....pup 'a.classname[href] attr{href}' < tut.html >links.md
Eu encontrei uma solução aqui que é IMHO muito mais simples e potencialmente mais rápida do que o que foi proposto aqui. Eu ajustei um pouco para suportar arquivos https. Mas a versão TD; TR é ...
PS: Você pode substituir o URL do site por um caminho para um arquivo e ele funcionará da mesma maneira.
Se você quiser apenas ver os links em vez de colocá-los em um arquivo, tente fazer isso ...
O resultado será semelhante ao seguinte ...
Para o meu caso de uso, isso funcionou bem. Mas cuidado com o fato de que hoje em dia, as pessoas adicionam links como src = "// blah.tld" para o CDN URI das bibliotecas. Eu não queria ver aqueles nos links recuperados.
Não é necessário tentar verificar href ou outras fontes quanto a links, porque "lynx -dump" extrai por padrão todos os links clicáveis de uma determinada página. Portanto, a única coisa que você precisa fazer depois disso é analisar o resultado do "lynx -dump" usando o grep para obter uma versão bruta mais limpa do mesmo resultado.
fonte
... provavelmente faria muito bem. Como está escrito, ele imprime:
Se for importante que você corresponda apenas a links e dentre esses domínios de nível superior, você pode:
... ou algo parecido - embora, para alguns
sed
s, seja necessário substituir um\n
caractere literal de linha por cada um dos dois últimosn
s.Conforme escrito, o comando acima é impresso:
... e em ambos os casos (mas provavelmente com mais utilidade com o último), você pode aplicar um
|sort -u
filtro até o final para obter a listasort
e eliminar duplicatas.fonte
Mais curto
fonte
fonte