Python BeautifulSoup — получение внутренних ссылок со страницы

У меня есть базовый цикл для поиска ссылок на странице, которую я получил с помощью urllib2.urlopen, однако я пытаюсь следовать только внутренним ссылкам на странице.

Любые идеи, как заставить мой нижний цикл получать только ссылки, которые находятся в том же домене?

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

person user1213488    schedule 03.05.2012    source источник


Ответы (2)


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

если хост тот же или хост пуст (что для относительных путей), URL-адрес принадлежит тому же хосту.

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()

потому что ты делаешь это

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

никакие относительные пути не будут использоваться. они похожи

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

может вообще не использовать re?

person User    schedule 03.05.2012
comment
Не уверен, что понимаю, как реализовать это в моем цикле, хотя я вижу логику :) Вы знаете, как реализовать это в цикле? - person user1213488; 03.05.2012
comment
Вы говорите вообще не использовать re, но вы могли бы придумать регулярное выражение, которое соответствует http://whatever и (no http://) - person jadkik94; 03.05.2012

Несколько советов вашему краулеру: используйте mechanize в сочетании с BeautifulSoup, это значительно упростит вашу задачу.

person marbdq    schedule 04.05.2012