gpt4 book ai didi

javascript - 我可以使用 BeautifulSoup 深入研究内联 JavaScript 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:16:54 24 4
gpt4 key购买 nike

我想从一系列页面中抓取数据 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 代码。

以下是您的选择:

  1. 使用类似 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"

    请注意,为了一个工作示例和解析错误,我不得不削减脚本。可能不适用于您的真实脚本内容,请检查。

  2. 使用正则表达式(最简单的选项但不可靠,所以不要在生产代码中使用它,除非您也可以控制 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"
  3. 让smth 执行javascript 代码:selenium (真正的浏览器),或 V8 , 或 PyExecJS

关于javascript - 我可以使用 BeautifulSoup 深入研究内联 JavaScript 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27162694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com