打开网页并返回所有链接及其文本的字典的功能

时间:2016-06-01 05:01:19

标签: python

编写一个打开网页的函数,并返回该页面上所有链接及其文本的字典。链接由看似

的HTML标记定义

< ahref =“http://my.computer.com/some/file.html”>链接文字< / A>

链接是href =之后引号中的所有内容,而文本是>之间的所有内容。和。对于上面的示例,字典中的条目如下所示:

“{”http:// my.computer.com/some/file.html“:”链接文字“,...}”

到目前为止,这是我的代码,我已经坚持了几个小时。我该如何解决这个问题?

import urllib.request


def Urls(webpage):
    url = webpage
    page = urllib.request.urlopen(url)
    url_list = {}
    for line in page:
        if '<a href=' in line:

4 个答案:

答案 0 :(得分:2)

虽然建议用正则表达式解决这个问题的答案可能可行,但它们会失败(除非你采取措施),例如链接分为几行。例如。这是完全有效的HTML:

<a
href="../path">link</a>

还有一些其他边缘情况需要考虑。通常,HTML无法使用正则表达式进行解析,并且有一些excellent prose已经写过。顺便说一句,构造"a href" in line是一种不那么强大的正则表达形式,它只是在一行中搜索并具有相同的缺点。

相反,您应该研究将HTML解析为格式正确的XML文档的库。在Python中,首选库是beautifulsoup。有了它,您可以快速获取网页中的所有链接,例如像这样:

import urllib
from bs4 import BeautifulSoup
url = "http://www.imdb.com/"
page = urllib.request.urlopen(url)
soup = BeautifulSoup(page, 'html.parser')
soup.find_all('a') # returns all links as a list
links = [a['href'] for a in soup.find_all('a', href=True)] # some anchors might have no href attribute, by specifying href=True, you'll get only those that do

beautifulsoup documentation的记录非常详细,有很多例子。非常值得一读。

答案 1 :(得分:0)

def Urls(webpage):
    url = webpage
    page = urllib.request.urlopen(url)
    url_list = {}
    for line in page:
        if '<a href=' in line:
            try:
                url = line.split('<a href="')[-1].split('">')[0]
                txt = line.split('<a href="')[-1].split('">')[-1].split('< /a>')[0]
                url_list[url] = txt
             except:
                 pass
     return url_list

答案 2 :(得分:0)

r=re.compile("<\s*a\s*href=\"(.*?)\">(.*?)<\s*/a\s*>")
list = r.findall(line)
for tuple in list:
    url_list[tuple[0]] = tuple[1]

答案 3 :(得分:0)

使用requestsSoupStrainer来简化/提高效率:

import requests
from bs4 import BeautifulSoup, SoupStrainer

def get_urls(webpage):
    res = requests.get(webpage)
    links = [l for l in BeautifulSoup(res.text, parseOnlyThese=SoupStrainer('a'))             
             if l.has_attr('href')]
    return links