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

时间:2016-06-03 21:20:27

标签: python

我正在尝试打开一个网页,并将所有链接作为字典返回,如下所示。

{"http://my.computer.com/some/file.html" : "link text"}

所以链接将在href =之后,文本将在&gt;之间。和</a>

我正在使用https://www.yahoo.com/作为我的测试网站

我一直收到这个错误:

'href=' in line:
TypeError: a bytes-like object is required, not 'str'

继承我的代码:

def urlDict(myUrl):
    url = myUrl
    page = urllib.request.urlopen(url)
    pageText = page.readlines()
    urlList = {}
    for line in pageText:
        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]
                urlList[url] = txt
            except:
                pass
        return urlList

我做错了什么?我环顾四周,人们主要建议这个mysoup解析器的东西。我会用它,但我不认为这会和老师一起飞。

2 个答案:

答案 0 :(得分:0)

问题在于您尝试将字节字符串与常规字符串进行比较。如果你在for循环中添加print(line)作为第一个命令,你会看到它会打印一串HTML,但它会有一个b&#39;在开头,表明它不是utf-8编码。这让事情变得困难。在这里使用urllib的正确方法如下:

   def url_dict(myUrl):
   with urllib.request.urlopen(myUrl) as f:
        s = f.read().decode('utf-8')

这将使 s 变量保存页面的整个文本。然后,您可以使用正则表达式来解析链接和链接目标。下面是一个示例,它将在没有HTML的情况下提取链接目标。

import urllib.request
import re

def url_dict():
   #  url = myUrl
    with urllib.request.urlopen('http://www.yahoo.com') as f:
        s = f.read().decode('utf-8')



    r = re.compile('(?<=href=").*?(?=")')
    print(r.findall(s))

url_dict()

使用正则表达式在字典中获取html和链接本身超出了你在课堂上的范围,所以我绝对不建议为作业提交它,尽管我建议学习它以备后用

您希望按照建议使用BeautifulSoup,因为它使整个过程非常简单。文档中有一个示例,您可以剪切和粘贴以提取URL。

答案 1 :(得分:0)

对于它的价值,这是BeautifulSouprequests方法。

可以随requests替换urllib,但BeautifulSoup并没有真正的替代品。

import requests
from bs4 import BeautifulSoup

def get_links(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, "html.parser")
    return { a_tag['href']: a_tag.text for a_tag in soup.find_all('a') }

for link, text in get_links('https://www.yahoo.com/').items():
    print(text.strip(), link)