我在使用不和谐的漫游器在YouTube上查找视频时遇到错误

时间:2020-07-06 02:31:48

标签: python-3.x href discord.py findall re

@bot.command()
async def buscayt(ctx, *, search):
    query_string = parse.urlencode({'search_query': search})
    html_content = request.urlopen('http://www.youtube.com/results?' + query_string)
    search_results = re.findall(href = ("/watch/?v=(.{11})", html_content.read().decode())
    print(search_results)

query_string用于搜索我想要的东西。

html_content用于打开yt以及我搜索的内容。

search_results应该以代码形式返回视频结果,但这是我遇到的错误。

这段代码是给我的不和谐机器人使用的,但是当使用该命令时,它会以未定义的href形式显示错误,所以我真的不知道如何解决它。

1 个答案:

答案 0 :(得分:0)

这是说href是未定义的,因为您将其视为带有表达式href =的变量。如果要匹配文字字符串href=,则需要将其包括在findall正则表达式的引号中:

re.findall(r'href="/watch\?v=(.{11})"', html_content.read().decode())

(请注意,/后还有一个额外的watch,它不是标准YouTube视频URL的一部分。)

但是,即使那样,您也不会得到任何结果,因为YouTube搜索是使用Javascript动态填充的。这意味着您在通过urlopen获得的代码中将看不到实际的HTML链接。 (尝试一下-转到YouTube搜索,右键单击该页面,单击“查看页面源”,然后搜索一些链接。)

这是一个常见问题,一种常见的解决方案是使用this answer中所述的Selenium。不过,在这种情况下,您很幸运,因为YouTube页面确实包含一系列包含要查找的URL的Javascript对象。因此,只需将搜索更改为:

re.findall(r"/watch\?v=(.{11})", html_content.read().decode())

您应该很好。请注意,您确实需要在问号之前加一个反斜杠,以使其在正则表达式中正确转义,并且r使其成为raw string