0

我有一个基本循环来查找我用 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
4

2 回答 2

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 ?

于 2012-05-03T16:27:48.040 回答
0

Some advice for your crawler: Use mechanize in combination with BeautifulSoup, that will simplify a lot your task.

于 2012-05-04T08:41:35.020 回答