这个问题是我之前的一个提问 经过了两三天的研究终于解决了
背景:
import requests
from lxml import etree
url = "https://music.163.com/discover/toplist?id=3779629"
headers = {
'User-Agent': "PostmanRuntime/7.15.2",
}
response = requests.request("GET", url, headers=headers)
'''
”<”、”&”
'''
r = etree.HTML(response.text)
l = r.xpath("//textarea[@id='song-list-pre-data']/text()")
print(l)
最终输出(支只复制了最后一段):
lLevel":"exhigh","pl":320000},"djid":0,"fee":0,"album":{"id":158052587,"name":"Sakana~( ˵>ㅿㅿ\n']
正常来说 这个xpath语句 是匹配到一个完整的json形式数据 但是遇到了特殊符号 就在特殊符号处匹配结束了 导致信息拿不全
解决办法:
使用 bs4解析包(由查阅相关资料,stackoverflow 网评bs4比xpath在某些特殊场景更健壮)
并且注意soup = BeautifulSoup(response.text, "lxml")
的参数一定不要使用 lxml 要使用 html.parser
最终代码:
import requests
from bs4 import BeautifulSoup
url = "https://music.163.com/discover/toplist?id=3779629"
headers = {
'user-agent': "PostmanRuntime/7.15.2"
}
response = requests.request("GET", url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
textarea = soup.find('textarea', attrs={'id': 'song-list-pre-data'}).get_text()
print(textarea)
最终输出可以拿到完整的str用于json化
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。