Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用BeautifulSoup深入研究内联JavaScript吗?_Javascript_Python_Beautifulsoup - Fatal编程技术网

我可以使用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")}

我想从一系列页面中提取一块数据,这些页面将数据隐藏在脚本标记内的JSON对象中。我对BeautifulSoup相当满意,但我想我可能是找错了方向,试图使用它从JavaScript获取数据

页面结构大致如下:

...
<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代码

以下是您的选项:

  • 使用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')
    #打印“我想要的东西”
    
    请注意,为了一个有效的示例和分析错误,我不得不减少脚本。可能对您的真实脚本内容不起作用,请检查

  • 使用正则表达式(这是最简单但不可靠的选项,因此不要在生产代码中使用它,除非您也可以控制JS代码,并且可以提供所需的保证):

    重新导入
    从bs4导入BeautifulSoup
    data=”“”
    $(文档).ready(函数(){
    var data=$.data(graph_选择器,[{data:charts.createData(“我想要的东西”)});
    """
    汤=美汤(数据)
    script=soup.find('script')
    pattern=r'charts.createData\((.*)\)'
    打印搜索(模式、脚本、文本)。组(1)#打印“我想要的东西”
    
  • 让smth执行javascript代码:(真实浏览器),或


  • 我会使用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"