这个问题是我之前的一个提问 经过了两三天的研究终于解决了
背景:

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化


瑞0908
318 声望74 粉丝

一个一个解决