编写一个打开网页的函数,并返回该页面上所有链接及其文本的字典。链接由看似
的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:
答案 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)
使用requests
和SoupStrainer
来简化/提高效率:
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