我想要一种为osu生成文件名的方法!我正在下载的节拍图。理想情况下,我将遍历HTML查找某个短语beatmapsets?q=
,并获得q=
之后的单词。
我尝试使用lxml.html,但是我对此经验很少,在下面的代码中,它返回一个空列表。
class OsuMaps:
def generateFileName(self, num1=None):
if not num1:
print("Missing required argument: 'num1'")
return
dl = requests.get(f"https://bloodcat.com/osu/s/{num1.rstrip()}")
# ..generate FinalName
tree = fromstring(dl.content)
FinalName = tree.xpath(
"//a[contains(@href='beatmapsets?q=')]"
)
return FinalName
osu - OsuMaps()
osu.generateFileName("653534") # ideal outcome - "653534 Panda Eyes - ILY"
已对理想结果进行了注释,但是我不知道从哪里开始。我所知道的是我需要的两个关键词[分别是歌曲名ILY和歌手Panda Eyes]在HTML中,如下所示:
<a class="beatmapset-header__details-text beatmapset-header__details-text--title u-ellipsis-overflow" href="/beatmapsets?q=ILY">ILY</a>
和
<a class="beatmapset-header__details-text beatmapset-header__details-text--artist" href="/beatmapsets?q=Panda%20Eyes">Panda Eyes</a>
我还需要能够重复使用此代码,以便每次获取q=<text>
文本。
答案 0 :(得分:1)
根据请求documentation,requests.get.content
返回原始字节响应。
您需要解析的是dl.text
。
也有@RomanPerekhrest指出,给定的链接引用了一个二进制文件,因此用lxml
进行解析是没有意义的。但是,您可以使用requests.head()
方法来获取文件名并提取所需的数据。
尝试如下操作:
dl = requests.head(f"https://bloodcat.com/osu/s/{num1.rstrip()}")
fname = dl.headers["Content-Disposition"].split('filename="')[-1].split('";')[0].replace("%20", " ")
# fname == '653534 Panda Eyes - ILY.osz'