有没有办法从 javascript 文档中提取列表?

Posted

技术标签:

【中文标题】有没有办法从 javascript 文档中提取列表?【英文标题】:Is there a way I can extract a list from a javascript document? 【发布时间】:2022-01-14 20:23:27 【问题描述】:

有一个网站,我需要从在线游戏项目和研究中获取该项目的所有者,我需要进行一些“网络抓取”来获取这些数据。但是,信息在 javascript 文档/代码中,不是一个易于解析的 HTML 文档,如 bs4 表明我可以轻松地从中提取信息。所以,我需要在这个 javascript 文档中获取一个变量(包含我正在查看的项目的所有者列表)并 将它变成一个可用的列表/json/字符串,我可以在我的程序中实现。有没有办法我可以做到这一点?如果可以,我该怎么做?

我附上了一张我在查看我所在网站的页面源代码时需要的变量的图片。

我当前的代码:

from bs4 import BeautifulSoup
html = requests.get('https://www.rolimons.com/item/1029025').content #the item webpage
soup = BeautifulSoup(html, "lxml")
datas = soup.find_all("script")
print(data) #prints the sections of the website content that have ja

IMAGE LINK

【问题讨论】:

你的附件图片在哪里? 已修复,抱歉,我是 *** 的新手 【参考方案1】:

要抓取 javascript 变量,不能只使用 BeautifulSoup。需要正则表达式 (re)。

使用ast.literal_eval将dict的字符串表示形式转换为dict。

from bs4 import BeautifulSoup
import requests
import re
import ast

html = requests.get('https://www.rolimons.com/item/1029025').content #the item webpage
soup = BeautifulSoup(html, "lxml")

ownership_data = re.search(r'ownership_data\s+=\s+.*;', soup.text).group(0)
ownership_data_dict = ast.literal_eval(ownership_data.split('=')[1].strip().replace(';', ''))
print(ownership_data_dict)

输出:

> 'id': 1029025, 'num_points': 1616, 'timestamps': [1491004800,
> 1491091200, 1491177600, 1491264000, 1491350400, 1491436800,
> 1491523200, 1491609600, 1491696000, 1491782400, 1491868800,
> 1491955200, 1492041600, 1492128000, 1492214400, 1492300800,
> 1492387200, 1492473600, 1492560000, 1492646400, 1492732800,
> 1492819200, ...

【讨论】:

感谢您与我们联系。我收到错误“AttributeError: 'NoneType' object has no attribute 'group'”,当我打印没有“。组(0)”它打印为无。你知道什么可能导致这个问题吗?这应该是您放置的代码的第 9 行。 它适用于我的环境。请检查您是否正确收到请求的响应。 我能想到的唯一问题是当我没有安装“lxml”库时 [pip install lxml] 我收到错误“找不到带有您要求的功能:lxml。您需要安装解析器库吗?这是你安装的吗?安装了这个后,我得到了上面描述的错误。 让我们试试html.parser ---> soup = BeautifulSoup(html, "html.parser") 嗯,我改变了它,没有任何改变。我认为问题出在“soup = BeautifulSoup(html, "lxml")” 中,因为当我打印它时,它不包含“ownership_data”或我看到的任何数据。 (即使我改变了同样的事情)【参考方案2】:
import requests
import json
import re

r = requests.get('...')
m = re.search(r'var history_data\s+=\s+(.*)', r.text)
print(json.loads(m.group(1)))

【讨论】:

请记住,Stack Overflow 不(只是)旨在解决眼前的问题,而是(也)帮助未来的读者理解解决方案,以便他们可以将其应用于类似的问题,或者变得更好理解代码。鉴于此,请不要只发布代码。你能edit你的答案包括解释你在做什么以及为什么你认为这是最好的方法吗?

以上是关于有没有办法从 javascript 文档中提取列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 FileNet 数据库中提取文档

如何从Javascript中的页面中提取链接列表

带有从加入列表中提取的元数据的 Sharepoint 文档库 - 是不是可以不编码?

有没有办法提取发生短路的 Python 布尔值列表的索引?

如何从二维数组中提取多列?

如何从 CouchDB 中提取 CouchApp