@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形式显示错误,所以我真的不知道如何解决它。
答案 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。