我可以使用BeautifulSoup深入研究内联JavaScript吗?
我想从一系列页面中提取一块数据,这些页面将数据隐藏在脚本标记内的JSON对象中。我对BeautifulSoup相当满意,但我想我可能是找错了方向,试图使用它从JavaScript获取数据 页面结构大致如下:我可以使用BeautifulSoup深入研究内联JavaScript吗?,javascript,python,beautifulsoup,Javascript,Python,Beautifulsoup,我想从一系列页面中提取一块数据,这些页面将数据隐藏在脚本标记内的JSON对象中。我对BeautifulSoup相当满意,但我想我可能是找错了方向,试图使用它从JavaScript获取数据 页面结构大致如下: ... <script> $(document).ready(function(){ var data = $.data(graph_selector, [ { data: charts.createData("Stuff I want")}
...
<script>
$(document).ready(function(){
var data = $.data(graph_selector, [
{ data: charts.createData("Stuff I want")}
])};
</script>
。。。
$(文档).ready(函数(){
变量数据=$.data(图形选择器[
{data:charts.createData(“我想要的东西”)}
])};
头部和身体各有无数个脚本,但每页只有一个var数据
。我不确定如何为BeautifulSoup识别这个特定的
,除非存在var数据
我可以这样做吗?或者我需要另一个工具吗?
BeautifulSoup
是一个HTML解析器,它不能解析javascript代码
以下是您的选项:
从bs4导入美化组
从slimit导入ast
从slimit.parser导入解析器
从slimit.visitors导入nodevisitor
data=”“”
变量数据=$.data(图形选择器[
{data:charts.createData(“我想要的东西”)}
]);
"""
汤=美汤(数据)
script=soup.find('script')
parser=parser()
tree=parser.parse(script.text)
打印下一个(node.args[0]。nodevisitor.visit(树)中节点的值
如果isinstance(node,ast.FunctionCall)和node.identifier.identifier.value=='createData')
#打印“我想要的东西”
请注意,为了一个有效的示例和分析错误,我不得不减少脚本。可能对您的真实脚本内容不起作用,请检查重新导入
从bs4导入BeautifulSoup
data=”“”
$(文档).ready(函数(){
var data=$.data(graph_选择器,[{data:charts.createData(“我想要的东西”)});
"""
汤=美汤(数据)
script=soup.find('script')
pattern=r'charts.createData\((.*)\)'
打印搜索(模式、脚本、文本)。组(1)#打印“我想要的东西”
我会使用BeautifulSoup查找原始javascript字符串,然后使用正则表达式获得“我想要的东西”,或者,等式中BeautifulSoup的值相当低。它允许您查找
节点,但这一点一开始并不难。(正确地说,你应该忽略任何被注释掉的选项,但实际上这并不是一个大问题。)@ivan_pozdeev感谢这些重要的注释。这就是为什么我将此选项放在第二个位置,并为第一个选项添加了一个工作示例。
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"
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"