Python,如果'word'在链接打印链接中,否则如果链接中的'2ndword'打印那个

时间:2013-08-13 08:40:35

标签: python loops if-statement hyperlink

所以我制作了一个python spider,它从给定的站点获取所有链接,然后打印出一个包含'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 个答案:

答案 0 :(得分:1)

认为我理解你想要实现的目标,你只想在每页打印其中一个网址;即使页面上也有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

这是未经测试的,但类似的东西应该起作用

答案 1 :(得分:0)

    if 'impressum' in newurl:
        print newurl
    elif 'kontakt' in newurl:
        print 'Not impressum:'
        print newurl

我没有看到你用什么方式来区分哪个“如果”案例咳嗽链接,所以试试这个,你会看到是ifelif块打印链接。< / p>

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

答案 2 :(得分:0)

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

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

如果上面的失败,elif将只执行它,所以你不需要在那里进行检查。

修改:

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

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

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

答案 3 :(得分:0)

您会看到这两个链接,因为它们发生在for循环的单独迭代中。单个if块仅查看单个网址,而elif会确保单个网址不会打印两次,以防它同时包含"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