用Python解析JavaScript

5

我通常使用 Beautiful Soup 来解析所需的 html,但是我遇到了一些 Javascript 代码,我想从 这里 获取。

 <script>
function Model(){
    this.players = [{".....data......:""}];...etc

我试图像这样加载它...

import json
scrape_url = "https://swishanalytics.com/optimus/nba/daily-fantasy-projections?date=2016-12-15"

result = json.loads(scrape_url)

但我收到了“无法解码Json”的消息。不确定如何处理此问题。

1
正如您的标签所说,您知道应该使用BeautifulSoup,但是为什么您的代码使用json.loads(URL)呢?请检查json文档,它并不像您想象的那样。 - Moinuddin Quadri
所以你想从脚本中提取数据?你首先需要将其隔离,即仅获取字符串 {".....data......:"},然后使用 json.loads - Tadhg McDonald-Jensen
@MoinuddinQuadri,我无法使用bs4使其正常工作。 - Ravash Jalil
@TadhgMcDonald-Jensen,明白了,谢谢! - Ravash Jalil
@TadhgMcDonald-Jensen 我该如何指定数据区域? - Ravash Jalil
我之前并不知道如何做到这一点(在阅读了Alex Hall的解决方案之前),但我想这个评论可能会帮助其他人(包括你)理解你想要的是什么。 - Tadhg McDonald-Jensen
1个回答

14

您可以使用jsonfinder库从任意文本中提取JSON:

from jsonfinder import jsonfinder
import requests

scrape_url = "https://swishanalytics.com/optimus/nba/daily-fantasy-projections?date=2016-12-15"
content = requests.get(scrape_url).text
for _, __, obj in jsonfinder(content, json_only=True):
    if (obj and
            isinstance(obj, list) and
            isinstance(obj[0], dict) and
            {'player_id', 'event_id', 'name'}.issubset(obj[0])
            ):
        break
else:
    raise ValueError('data not found')

# Now you can use obj
print(len(obj))
print(obj[0])

运行得非常好 :) - Nabin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接