烦恼一般都是想太多了。

0%

Python解析网页内容

缘由是有伙计让我帮他下歌,问题是也太多了,当前很多站都无法下载了,其实不是不能,而是不能直接下载了。而且他提过来的是一大串,还好,是在一个网页上。所以就想着弄个简单的脚本来解析一下歌曲信息,然后利用现成的工具来下载。

下载工具

music-dl 这个 Python 做的工具很不错的,用起来非常的简单。

request

首先利用 request 来读取网页,然后利用 bs4 - 是一个可以从HTML或XML文件中提取数据的Python库 来解析网页,最终就可以在解析后的文档内进行查询网页的 tag 了。

我们可以根据多个维度来查询 tag ,比如 tag 的属性,tag 的名字。看了一下网页的内容,其需要下载的歌曲代码都是这样:

<section style="margin-right: 16px;margin-left: 16px;white-space: normal;line-height: 1.75em;"><qqmusic class="rich_pages res_iframe qqmusic_iframe js_editor_qqmusic place_music_area" scrolling="no" frameborder="0" musicid="1523426" mid="004YiLGL3YIQKj" albumurl="https://y.gtimg.cn/music/photo_new/T002R68x68M000002jZnFz008v3G.jpg" audiourl="http://isure.stream.qqmusic.qq.com/C200002vanCa45g9n3.m4a?guid=2000001731&amp;vkey=BBA07DCF7D92D326676B3092BFF043E626B96BBD7B878231F65DC5A02207CC558867B96B811419FA85D837B16FBE007DEB703AEB2EC1A003&amp;uin=&amp;fromtag=50" music_name="恋曲1990" singer="罗大佑&nbsp;-&nbsp;光阴的故事&nbsp;电视原声带" play_length="320" src="[https://mp.weixin.qq.com/cgi-bin/readtemplate?t=tmpl/qqmusic_tmpl&singer=%E7%BD%97%E5%A4%A7%E4%BD%91%20-%20%E5%85%89%E9%98%B4%E7%9A%84%E6%95%85%E4%BA%8B%20%E7%94%B5%E8%A7%86%E5%8E%9F%E5%A3%B0%E5%B8%A6&music_name=%E6%81%8B%E6%9B%B21990&albumurl=https%3A%2F%2Fy.gtimg.cn%2Fmusic%2Fphoto_new%2FT002R68x68M000002jZnFz008v3G.jpg&musictype=1](https://mp.weixin.qq.com/cgi-bin/readtemplate?t=tmpl/qqmusic_tmpl&singer=罗大佑 - 光阴的故事 电视原声带&music_name=恋曲1990&albumurl=https%3A%2F%2Fy.gtimg.cn%2Fmusic%2Fphoto_new%2FT002R68x68M000002jZnFz008v3G.jpg&musictype=1)" musictype="1" otherid="004YiLGL3YIQKj" albumid="002jZnFz008v3G" jumpurlkey="" style="width: 542px;"></qqmusic></section>

所以我只需要有 music_name 属性的 section 标签就可以拿到所有的信息,然后反过来,再将 section tag 内的 music_name/singer 给打印出来就OK。

import requests
from bs4 import BeautifulSoup

url = 'https://mp.weixin.qq.com/s/ffYx-y9V7kIuMPp2R27j9A'

if __name__ == '__main__':
req = requests.get(url=url)
html = req.text
bf = BeautifulSoup(html)
texts = bf.find_all(music_name=True)
for e in texts:
print(e['music_name'], e['singer'].split('-')[0])

输出:

恋曲1990 罗大佑 
对你爱不完 郭富城
我是不是该安静的走开 郭富城
亲亲我的宝贝 周华健
是否我真的一无所有 王杰
其实你不懂我的心 童安格
明天你是否依然爱我 童安格
耶利亚女郎 童安格
....
....

简单又高效,然后用名字手动去下载就行了。

因为查询出来的歌曲,毕竟是不准的,很难准确的匹配上。