- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想从一系列页面中抓取数据 block ,这些页面将数据隐藏在脚本标记内的 JSON 对象中。我对 BeautifulSoup 相当满意,但我认为我尝试使用它从 JavaScript 获取数据可能是找错了树。
页面的结构大致是这样的:
...
<script>
$(document).ready(function(){
var data = $.data(graph_selector, [
{ data: charts.createData("Stuff I want")}
])};
</script>
头部和 body 各有无数个脚本,但只有一个 var data
每页。我不确定如何识别这个特定的 <script>
对于 BeautifulSoup,除了存在 var data
我可以这样做吗?或者我需要其他工具吗?
最佳答案
BeautifulSoup
是一个 HTML 解析器,它不能解析 javascript 代码。
以下是您的选择:
使用类似 slimit
的 javascript 解析器
from bs4 import BeautifulSoup
from slimit import ast
from slimit.parser import Parser
from slimit.visitors import nodevisitor
data = """
<script>
var data = $.data(graph_selector, [
{ data: charts.createData("Stuff I want")}
]);
</script>
"""
soup = BeautifulSoup(data)
script = soup.find('script')
parser = Parser()
tree = parser.parse(script.text)
print next(node.args[0].value for node in nodevisitor.visit(tree)
if isinstance(node, ast.FunctionCall) and node.identifier.identifier.value == 'createData')
# prints "Stuff I want"
请注意,为了一个工作示例和解析错误,我不得不削减脚本。可能不适用于您的真实脚本内容,请检查。
使用正则表达式(最简单的选项但不可靠,所以不要在生产代码中使用它,除非您也可以控制 JS 代码并且可以做出所需的保证):
import re
from bs4 import BeautifulSoup
data = """
<script>
$(document).ready(function() {
var data = $.data(graph_selector, [{data: charts.createData("Stuff I want")}])};
</script>
"""
soup = BeautifulSoup(data)
script = soup.find('script')
pattern = r'charts.createData\("(.*?)"\)'
print re.search(pattern, script.text).group(1) # prints "Stuff I want"
关于javascript - 我可以使用 BeautifulSoup 深入研究内联 JavaScript 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27162694/
我正在从我的服务器取回以下数据集 {"success":"y","carrier":"Verizon Wireless","isMobile":"true"} 当我尝试深入了解我的 ajax 函数的
我无法引用处于传递给子组件状态的对象和数组的元素。 当我无法在某些子组件中引用它们时,我无法清楚地识别这些情况之间的差异。 我想念什么? 组件的示例属性在组件下给出。发表了评论。例如,我无法引用 cu
我是一名使用 ASP.NET 的网络开发新手。我还没有真正需要 javascript 来做任何事情,因为到目前为止我构建的应用程序都是相当简单的数据挖掘应用程序,我的观众并不在寻找花里胡哨的东西。但是
我在尝试进一步深入了解 json 数据以提取特定的键/值对时遇到问题。我只是想拉出经度/纬度,我认为它是位置的子数组,它是几何的子数组。我的 JSON: results": [ {
Ignoring Block: Either I'm wrong here, or the whiskey is starting to work. (I don't want to rule out
我目前正在使用 C++ 开发一个无线网络应用程序,并且它已经到了我想要在一个进程下多线程处理软件片段的地步,而不是将它们都放在单独的进程中。从理论上讲,我了解多线程,但实际上我还没有深入研究。 每个程
我是一名优秀的程序员,十分优秀!