0

因此,我制作了一个 python 蜘蛛,它从给定站点获取所有链接,然后打印出包含'impressum'自身的链接。现在我想创建一个elif函数,如果在链接中找不到该链接,则打印出包含'kontakt'在 istelf'impressum'中的链接。我现在的代码如下所示:

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.zahnarztpraxis-uwe-krause.de"

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=5)

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

newurlArray = []

for link in br.links(text_regex=re.compile('^((?!IMG).)*$')):
    newurl = urlparse.urljoin(link.base_url, link.url)
    if newurl not in newurlArray:
        newurlArray.append(newurl)
        #print newurl
        if 'impressum' in newurl:
            print newurl

        elif 'impressum' not in newurl and 'kontakt' in newurl:
            print newurl

尽管有这个if elif循环,我总是在控制台中获得两个链接:

http://www.zahnarztpraxis-uwe-krause.de/pages/kontakt.html
http://www.zahnarztpraxis-uwe-krause.de/pages/impressum.html

但在真实情况下,只有在没有找到 'impressum' 的情况下,我才需要使用 'kontakt'。

我究竟做错了什么?

4

4 回答 4

1

您会看到这两个链接,因为它们发生在循环的不同迭代中for。单个if块仅查看单个 URL,并elif确保单个 URL 不会被打印两次,以防它同时包含"impressum""kontakt"。它不会阻止在以后的迭代中打印更多链接。

为了实现您想要的,您首先必须遍历所有链接并在循环后决定要打印什么,因为您希望"impressum"在任何情况下都具有优先权。"impressum"只有看完所有链接才能知道是否有:

urls = set()
contact_keys = ["impressum", "kontakt"]
found_contact_urls = {}
for link in ...:
    new_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

此代码允许向列表添加更多后备字符串contact_keys

于 2013-08-13T08:55:30.817 回答
1

我理解您想要实现的目标,您只想在每页打印一个这些 URL;总是打印impressum链接,即使kontakt也在页面上,如果impressum不在页面上,则打印kontakt,对吗?

如果是这样,您可以添加一个标志来说明是否impressum在页面上以及要打印哪个 URL,或者填充一个变量并打印它,如下所示:

myUrl = "" #somewhere at start of processing where it is only set to "" once
    #in loop:
    if 'impressum' in newurl:
        myUrl = newurl
    elif not myUrl and 'kontakt' in newurl:
        myUrl = newurl
print myUrl #print after entire page has been processed

这是未经测试的,但类似的东西应该可以工作

于 2013-08-13T08:58:23.720 回答
0
if 'impressum' in newurl:
    print "Impressum:", newurl

elif 'kontakt' in newurl:
    print "Kontakt:", newurl
else:
    pass // not impressum and not kontakt

只会在elif上面的 if 失败时执行,所以你不需要在那里仔细检查。

编辑:

如果您希望蜘蛛在找到链接后停止爬行,请将您的代码更改为:

if 'impressum' in newurl:
    print "Impressum:", newurl
    break

elif 'kontakt' in newurl:
    print "Kontakt:", newurl
    break
else:
    pass // not impressum and not kontakt
于 2013-08-13T08:45:11.397 回答
0
    if 'impressum' in newurl:
        print newurl
    elif 'kontakt' in newurl:
        print 'Not impressum:'
        print newurl

我没有看到您有什么方法可以区分哪个“如果”案例咳嗽链接,所以试试这个,您会看到它是否是链接ifelif块打印链接。

正如@Joshua 所写,你不需要做“ 'impressum' not in newurl”,因为它已经在if块中检查过了。

于 2013-08-13T08:44:06.350 回答