在Python 3中查找超链接

时间:2017-05-03 16:43:52

标签: python-3.x hyperlink

所以我的任务是编写一个程序,从网页中读取所有数据并打印表格的所有超链接:

 <a href="link">link text</a>

到目前为止,在我的导师帮助下,我已经走到了这一步。

from urllib.request import urlopen

def findTitle(webpage):
    encoding = "utf-8"
    for webpagestr in webpage:
        webpagestr = str(webpagestr,encoding)
        if "<title>" in webpagestr:
            indexstart = webpagestr.find("<title>")
            indexend = webpagestr.find("</title>")
            title = webpagestr[indexstart+7:indexend]
            return title
        return title


def H1headings(webpage):
    encoding = "utf-8"
    for webpagestr in webpage:
        webpagestr = str(webpagestr,encoding)
        if "<h1>" in webpagestr:
            indexstart = webpagestr.find("<h1>")
            indexend = webpagestr.find("</h1>")
            heading = webpagestr[indexstart+4:indexend]
            print(heading)

def main():
    address = input("Enter URL to find title and more information: ")
    try:
        webpage = urlopen(address)
        title = findTitle(webpage)
        print("Title is", title)

        H1headings(webpage)

        webpage.close()

    except Exception as exceptObj:
        print("Error: ", str(exceptObj))
main()

当我运行这个程序时,它允许我输入一个URL,但在它给我一个:     错误:本地变量&#39; title&#39;在分配前引用

我不确定这意味着什么。

然后我放置了一次尝试:

def findTitle(webpage):
    title = "Not Found"
    encoding = "utf-8" 

运行程序,它会给我:

Enter URL to find title and more information: http://jeremycowart.com
Title is not found
<a href="http://jeremycowart.com">Jeremy Cowart</a>

这是我正在寻找的东西,但我相信我想要有标题和标题以及链接文字。

我已经接近但我无法弄明白。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我看到至少有几个问题。

在您的函数findTitle中,即使您找不到变量,也始终返回变量title,因此无法将变量title设置为任何事情,因此当它无法在网页上找到标题时(无论是因为没有一个或你的代码未能找到它),它返回的是一个尚未创建/分配的变量爱好。

首先,您应该修复您的代码,以便它不会这样做。您可以更改最终的return语句以返回默认值,例如"Not found"或者您可以将title设置为函数顶部的默认值,这可以保证无论何时返回它都会存在,例如:

def foo(x):
    y = -1
    <do stuff, maybe re-setting y>
    return y

这是我更喜欢的模式。

但是还有另一个问题,即阻止您正确检测标题。如果你单步执行程序,你应该看到它。基本上,你开始循环,获得第一行,检查它是否有标题;如果它确实你返回它(好),如果它没有你跳过if,但是你仍然返回它(不太好)并且你永远不会到达第二行。