• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Ridelight

Obter links de páginas web

8 mensagens neste tópico

Alguem conhece um software que obtenha todos os links de páginas web e respectivo nome do link?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não... Mas conheço uma enormidade de linguagens que permitem fazer isso. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
import urllib
import re
re.findall(re.compile('<a.+?href="(.+?)".*?>(.*?)</a>'), urllib.urlopen("http://www.portugal-a-programar.org/forum/").read())

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É bem mais complicado do que a maior parte das pessoas pensa. Tipicamente recebes as respostas que te acabaram de dar, que podem parecer obvias mas têm várias limitações.

por exemplo, assim olhando para a solução do fnds, não apanha links cuja ancora usa letras maíusculas, não apanha paths, e provavelmente terá outros problemas que agora não me lembro.

As paths têm que funcionar em todos os casos, um url tipo http://pap.com/ é diferente de http://pap.com, e http://pap.com/path não é o mesmo que http://pap.com/path/

Mas vou dar-te uma solução robusta.

Usa um parser que seja desenvolvido em condições para esse efeito.

por exemplo, uma implementação do DOM.

No cpan estão praí meia dúzia de módulos que servem para extrair links e afins, todos eles, algures na sua diminuta documentação referem que são apenas um brinquedo para extrair links de uma página para pequenas situações pontuais e não uma soluçao robusta.

Lê este artigo que é tão simples quão magnifico:

http://www.merchantos.com/makebeta/php/scraping-links-with-php/

é o único artigo deste tipo que conheço, não encontrei mais nenhum por aí.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esqueci-me desse promenor do case-sensitive.

Não apanha paths como? :) ele apanha tudo o que está href="aqui".

Assim já é case-insensitive.

import urllib
import re
re.findall(re.compile('<a.+?href="(.+?)".*?>(.*?)</a>', re.I), urllib.urlopen("http://www.portugal-a-programar.org/forum/").read())
re.findall(re.compile('<a.+?href=\'(.+?)\'.*?>(.*?)</a>', re.I), urllib.urlopen("http://www.portugal-a-programar.org/forum/").read())

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Outra hipótese era fazer match de <[aA] ou lá como se escreve. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Outra hipótese é usares um componente que te permita obter uma listagem dos links, tipo www mechanize e afins.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Outra hipótese era fazer match de <[aA] ou lá como se escreve. :P

Mas isso resolveria apenas um problema, apareceriam outros, por exemplo links com html no seu interior.

Na verdade é tecnicamente impossível arranjar uma solução baseada simplesmente numa regex, as regex's devem ser usadas mas outras lógicas têm que entrar em cena, nomeadamente a estrutura em árvore do documento.

Não sei muitos detalhes sobre a implementação do mechanize, mas tem todo o jeito de usar um parser em condições, pessoalmente seria outra solução que eu consideraria.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora