Try/except 未按预期工作:"Except" 错误消息附加到传递结果
Try/except not working as expected: "Except" error message is appended to passing result
我的代码旨在在网页上查找图表并创建一个 link 用于从中进行网络抓取。如果找不到图表,那么我会输入一个 try/except 来打印一条带有相应(播放器)link 的消息,因此如果找不到,它会继续下一个。
它来自一个足球估值网站,为了调试,我减少了两名球员的名单:一个是 Kylian Mbappé(他的页面上有图表并且应该通过)和另一个 Ansu Fati(没有) .尝试使用 BeautifulSoup 从 Ansu Fati 的个人资料中获取图表标签会导致 NoneType
错误。
这里的问题是 Mbappé 的图表 link 确实在代码中被提取用于下游处理,但是 except 子句中的 "except" error/link 消息也被打印到安慰。应该只有安苏·法提才会这样。
这是代码
final_url_list = ['https://www.transfermarkt.us/kylian-mbappe/profil/spieler/342229','https://www.transfermarkt.com/ansu-fati/profil/spieler/466810']
for i in final_url_list:
try:
int_page = requests.get(i, headers = {'User-Agent':'Mozilla/5.0'}).text
except requests.exceptions.Timeout:
sys.exit(1)
parsed_int_page = BeautifulSoup(int_page,'lxml')
try:
graph_container = parsed_int_page.find('div', class_='large-7 columns small-12 marktwertentwicklung-graph')
graph_a = graph_container.find('a')
graph_link = graph_a.get('href')
final_url_list.append('https://www.transfermarkt.us' + graph_link)
except:
pass
print("Graph error:" + i)
我尝试使用 PyCharm 的调试来查看解释器是如何执行这些步骤的,似乎整个 except 子句都被跳过了,但是当我在控制台中 运行 它时, "Graph error: link" 为两者发布。我不确定 try/except 问题以这种方式表现的代码有什么问题。
行
except None:
正在寻找类型为 None
的异常,这是不可能的。
尝试将该行更改为
except AttributeError:
这样做会产生以下输出:
Graph error:https://www.transfermarkt.com/ansu-fati/profil/spieler/466810
Graph error:https://www.transfermarkt.us/kylian-mbappe/marktwertverlauf/spieler/342229
这里还有一个额外的问题,您正在修改要迭代的列表,这不仅是不好的做法,而且会导致您看到的意外行为。
因为您要追加到您正在迭代的列表,所以您将为 url 添加一个您实际上不想抓取的迭代。要解决此问题,请将脚本中的前几行更改为:
url_list = ['https://www.transfermarkt.us/kylian-mbappe/profil/spieler/342229','https://www.transfermarkt.com/ansu-fati/profil/spieler/466810']
final_url_list = []
for i in url_list:
这样,您将图表链接附加到不同的列表,并且您不会尝试抓取不应该抓取的链接。这会将所有 "graph links" 放入 final_url_list
我的代码旨在在网页上查找图表并创建一个 link 用于从中进行网络抓取。如果找不到图表,那么我会输入一个 try/except 来打印一条带有相应(播放器)link 的消息,因此如果找不到,它会继续下一个。
它来自一个足球估值网站,为了调试,我减少了两名球员的名单:一个是 Kylian Mbappé(他的页面上有图表并且应该通过)和另一个 Ansu Fati(没有) .尝试使用 BeautifulSoup 从 Ansu Fati 的个人资料中获取图表标签会导致 NoneType
错误。
这里的问题是 Mbappé 的图表 link 确实在代码中被提取用于下游处理,但是 except 子句中的 "except" error/link 消息也被打印到安慰。应该只有安苏·法提才会这样。
这是代码
final_url_list = ['https://www.transfermarkt.us/kylian-mbappe/profil/spieler/342229','https://www.transfermarkt.com/ansu-fati/profil/spieler/466810']
for i in final_url_list:
try:
int_page = requests.get(i, headers = {'User-Agent':'Mozilla/5.0'}).text
except requests.exceptions.Timeout:
sys.exit(1)
parsed_int_page = BeautifulSoup(int_page,'lxml')
try:
graph_container = parsed_int_page.find('div', class_='large-7 columns small-12 marktwertentwicklung-graph')
graph_a = graph_container.find('a')
graph_link = graph_a.get('href')
final_url_list.append('https://www.transfermarkt.us' + graph_link)
except:
pass
print("Graph error:" + i)
我尝试使用 PyCharm 的调试来查看解释器是如何执行这些步骤的,似乎整个 except 子句都被跳过了,但是当我在控制台中 运行 它时, "Graph error: link" 为两者发布。我不确定 try/except 问题以这种方式表现的代码有什么问题。
行
except None:
正在寻找类型为 None
的异常,这是不可能的。
尝试将该行更改为
except AttributeError:
这样做会产生以下输出:
Graph error:https://www.transfermarkt.com/ansu-fati/profil/spieler/466810
Graph error:https://www.transfermarkt.us/kylian-mbappe/marktwertverlauf/spieler/342229
这里还有一个额外的问题,您正在修改要迭代的列表,这不仅是不好的做法,而且会导致您看到的意外行为。
因为您要追加到您正在迭代的列表,所以您将为 url 添加一个您实际上不想抓取的迭代。要解决此问题,请将脚本中的前几行更改为:
url_list = ['https://www.transfermarkt.us/kylian-mbappe/profil/spieler/342229','https://www.transfermarkt.com/ansu-fati/profil/spieler/466810']
final_url_list = []
for i in url_list:
这样,您将图表链接附加到不同的列表,并且您不会尝试抓取不应该抓取的链接。这会将所有 "graph links" 放入 final_url_list