0

所以我制作了一个网络蜘蛛,它扫描给定站点上的所有链接,并且我为他配置了两个条件来检查。

代码:

import urllib
import re
import mechanize
from bs4 import BeautifulSoup
import urlparse
import cookielib
from urlparse import urlsplit
from publicsuffix import PublicSuffixList

url = "http://www.physiotherme.com"

br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.set_handle_redirect(True)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
page = br.open(url, timeout=10)

htmlcontent = page.read()
soup = BeautifulSoup(htmlcontent)

urls = set()
contact_keys = ["impressum", "kontakt"]
found_contact_urls = {}

for link in br.links(text_regex=re.compile('^((?!IMG).)*$')):
    new_url = urlparse.urljoin(link.base_url, link.url)
    urls.add(new_url)
    for key in contact_keys:
        if key in new_url:
            found_contact_urls[key] = new_url
            break
for key in contact_keys:
    if key in found_contact_urls:
        print found_contact_urls[key]
        break
    else:
        print url
        break

这个想法是蜘蛛检查集合中的链接,如果他找到其中的链接,'impressum'它会打印出来,如果没有,他会打印出包含'kontakt'在其中的链接。

如果这两个链接都没有找到,那么他会打印出主站点的地址。

我正在查看的以下站点 ( http://www.physiotherme.com ) 没有链接,'impressum'但确实有'kontakt'word 链接。

但是我的蜘蛛没有打印出那个链接http://www.physiotherme.com/kontakt.html,他从主站点打印出那个链接,http://www.physiotherme.com即使那个'kontakt'链接在我的 url 集中。如果我print urls结束,我会在集合中看到想要的链接:

set(['http://www.physiotherme.com/sauna.html', 'http://www.physiotherme.com/kontakt.html', 'http://www.physiotherme.com/offen.html'])

所以我不知道我的代码有什么问题。为什么他不打印出来http://www.physiotherme.com/kontakt.html

编辑:

刚刚注意到,如果我删除

else:
    print url
    break

链接kontakt被打印出来。但这不是我的解决方案,因为在其他具有不同网站的情况下,如果contact_keys找不到这两个中的任何一个,我想打印主 url..

4

1 回答 1

0

您的代码逻辑与您的描述不一致。您的代码的最后一部分应该是:

for link in br.links(text_regex=re.compile('^((?!IMG).)*$')):
    new_url = urlparse.urljoin(link.base_url, link.url)
    ......

key_found_flag = False
for key in contact_keys:
    if key in found_contact_urls.keys():   
        print found_contact_urls[key]
        key_found_flag = True
        break
if not key_found_flag:
    print url
于 2013-08-14T07:27:01.330 回答