Python BeautifulSoup: toma enlaces internos de la página

Tengo un ciclo básico para buscar enlaces en una página que recuperé con urllib2.urlopen, sin embargo, solo intento seguir enlaces internos en una página.

¿Alguna idea de cómo hacer que mi ciclo de abajo obtenga solo enlaces que están en el mismo dominio?

for tag in soupan.findAll('a', attrs={'href': re.compile("^http://")}): 
                webpage = urllib2.urlopen(tag['href']).read()
                print 'Deep crawl ----> ' +str(tag['href'])
                try:
                    code-to-look-for-some-data...

                except Exception, e:
                    print e

preguntado el 03 de mayo de 12 a las 17:05

2 Respuestas

>>> import urllib
>>> print urllib.splithost.__doc__
splithost('//host[:port]/path') --> 'host[:port]', '/path'.

si el host es el mismo o el host está vacío (que es para rutas relativas), la URL pertenece al mismo host.

for tag in soupan.findAll('a', attrs={'href': re.compile("^http://")}):

            href = tag['href']
            protocol, url = urllib.splittype(href) # 'http://www.xxx.de/3/4/5' => ('http', '//www.xxx.de/3/4/5')
            host, path =  urllib.splithost(url)    # '//www.xxx.de/3/4/5' => ('www.xxx.de', '/3/4/5')
            if host.lower() != theHostToCrawl and host != '':
                continue

            webpage = urllib2.urlopen(href).read()

            print 'Deep crawl ----> ' +str(tag['href'])
            try:
                code-to-look-for-some-data...

            except:
                import traceback
                traceback.print_exc()

porque haces esto

'href': re.compile("^http://")

no se utilizarán rutas relativas. son como

<a href="/es/folder/file.htm"></a>

tal vez no use re en absoluto?

contestado el 03 de mayo de 12 a las 18:05

No estoy seguro de entender cómo implementar eso en mi bucle, aunque veo la lógica :) ¿Sabes cómo implementarlo en el bucle? - user1213488

dices no usar re en absoluto, pero podría encontrar una expresión regular que coincida http://whatever y (no http://) - jadkik94

Un consejo para tu rastreador: Usa mechanize en combinación con BeautifulSoup, eso simplificará mucho tu tarea.

contestado el 04 de mayo de 12 a las 09:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.