我正在使用Python编写代码以使用Beautiful soup获取URL中的所有'a'标记,然后我使用位置3处的链接并按照该链接,我将重复此过程大约18次。我包含了下面的代码,该过程重复了4次。当我运行此代码时,我在结果中得到相同的4个链接。我应该得到4个不同的链接。我认为我的循环中存在一些问题,特别是在y = url的行中。我需要帮助找出问题所在。
import re
import urllib
from BeautifulSoup import *
list1=list()
url = 'https://pr4e.dr-chuck.com/tsugi/mod/python-data/data/known_by_Fikret.html'
for i in range (4): # repeat 4 times
htm2= urllib.urlopen(url).read()
soup1=BeautifulSoup(htm2)
tags1= soup1('a')
for tag1 in tags1:
x2 = tag1.get('href', None)
list1.append(x2)
y= list1[2]
if len(x2) < 3: # no 3rd link
break # exit the loop
else:
url=y
print y
答案 0 :(得分:0)
您继续将第三个链接发送到您的结果列表。相反,你应该添加第三个链接OF THAT ITERATION(soup('a')[2]
),然后重新分配你的网址然后再去。
url = 'https://pr4e.dr-chuck.com/tsugi/mod/python-data/data/known_by_Fikret.html'
result = []
for i in range(4):
soup = BeautifulSoup(urllib.urlopen(url).read())
links = soup('a')
for link in links:
result.append(link)
try:
third_link = links[2]['href']
except IndexError: # less than three links
break
else:
url = third_link
print(url)
这在递归函数中实际上非常简单:
def get_links(url):
soup = BeautifulSoup(urllib.urlopen(url).read())
links = soup('a')
if len(links) < 3:
# base case
return links
else:
# recurse on third link
return links + get_links(links[2]['href'])
你甚至可以修改它以确保你没有太深入
def get_links(url, times=None):
'''Returns all <a> tags from `url` and every 3rd link, up to `times` deep
get_links("protocol://hostname.tld", times=2) -> list
if times is None, recurse until there are fewer than 3 links to be found
'''
def _get_links(url, TTL):
soup = BeautifulSoup(urllib.urlopen(url).read())
links = soup('a')
if (times is not None and TTL >= times) or \
len(links) < 3:
# base case
return links
else:
return links + _get_links(links[2]['href'], TTL+1)
return _get_links(url, 0)
答案 1 :(得分:0)
您当前的代码
y= list1[2]
只打印位于list1
索引2的URL。由于该列表仅被追加,list[2]
没有变化。如果您需要不同的URL,则应在每次打印时选择不同的索引。我不确定您尝试打印的具体内容,但y= list1[-1]
例如最终会打印在该次迭代中添加到列表中的最后一个URL(每次都不同)。 / p>