我正在尝试打开一个网页,并将所有链接作为字典返回,如下所示。
{"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解析器的东西。我会用它,但我不认为这会和老师一起飞。
答案 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)
对于它的价值,这是BeautifulSoup
和requests
方法。
可以随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)