使用Python中的Beauty soup从网站上的javascript结构提取数据时遇到的问题

使用Python中的Beauty soup从网站上的javascript结构提取数据时遇到的问题,javascript,python,json,python-2.7,html-parsing,Javascript,Python,Json,Python 2.7,Html Parsing,我正试图从一个使用Javascript结构加载数据的网站上抓取数据。我用这个问题的解决方案来实现这一点。在获取JSON数据字典之后,我对其进行了迭代,以成功获取设备名称和价格数据 上述问题解决方案中提到的代码实际上是从一个窗口中提取数据,该窗口具有设备名称和价格,其属性在代码中称为window.rates 问题:如果你看一下网站的结构,它有三个部分 第一部分包含带有计划名称及其其他详细信息的窗口 第二部分包含带有设备名称和价格的窗口(这是我当前正在从中提取数据的窗口) 第三部分包含计划名称、设备

我正试图从一个使用Javascript结构加载数据的网站上抓取数据。我用这个问题的解决方案来实现这一点。在获取JSON数据字典之后,我对其进行了迭代,以成功获取设备名称和价格数据

上述问题解决方案中提到的代码实际上是从一个窗口中提取数据,该窗口具有设备名称和价格,其属性在代码中称为window.rates

问题:如果你看一下网站的结构,它有三个部分

  • 第一部分包含带有计划名称及其其他详细信息的窗口
  • 第二部分包含带有设备名称和价格的窗口(这是我当前正在从中提取数据的窗口)
  • 第三部分包含计划名称、设备名称、价格及其每月价格
  • 我想从第三部分提取数据,因为我需要所有4个字段(计划名称、设备名称、价格、每月价格)。我能够使用上述问题的解决方案从第一部分和第二部分中提取数据

    现在,我找不到加载第三部分数据的javascript,也找不到属性(例如,第二部分的window.rates),我必须使用该属性来获取第三部分的JSON数据字典

    此外,当我们在第二部分滚动窗口时,网站第三部分中的数据也会发生变化

    附言:我试着打印页面上运行的所有脚本,以找出在第三部分加载数据的脚本,但没有任何帮助


    请帮助我解决此问题。

    您提供了一个指向上一个问题的链接,其中提到了您感兴趣的网站:

    你只要看看代码就行了

    假设您选择“红色M”作为计划,选择“三星Galaxy SIII Blau(蓝色)/16 GB。底部部分将显示:

    详细项目 Einmalige Kosten(一次性成本)
  • Anschlusspreis(激活费):29.99
  • Einmalzahlung(一次性支付)智能手机:9.90

    Monatliche Kosten(月费)
  • 红色M 59.99

  • 24 x 10%拉巴特(折扣)-6.00
  • 24 x 5欧元智能手机Rabatt-5.00

  • 此外,学生、年轻人或残疾人可享受三种10.00/月折扣中的一种

  • 您需要解析(可能使用Python的JSON模块)这些JavaScript分配:

    window.phones
    window.rates
    window.discounts
    window.goodies
    window.promotions
    
    我将带您浏览数据结构。您必须自己编写代码

    windows.phones
    ,包含以下条目(与我们的示例保持一致):

    我添加了注释以显示计划名称

    在这里,我们看到细节项目2

    此处列出的SKU是在
    窗口中定义的计划子SKU。费率
    。对于“红色M”,我们有:

    我再次为链接的数据添加了注释。注意,许多设备都可以链接到同一个subsku

    我们看到了详细的项目1和3以及到项目4、5和6的链接

    Goodies
    指向
    windows的链接。Goodies
    通过
    prod
    编号:

    window.goodies = {
        prod1674486:{
            SkuId:"prod1674486",
            Name:"24 x 10 % Rabatt",
            Value:"-6",
            Type:"absolute",
            DurationInMonth:"24"
        },
        // . . .
    }
    
    这给了我们第4项的细节

    window.rates
    还通过
    subsku
    promotions
    列表链接到
    windows.promotions

    window.promotions = {
        27:{
            promotionId:"27",
            promotionName:"24 x 5 Euro Smartphone-Rabatt",
            promotionValue:"-5",
            Type:"absolute",
            duration_in_months:"24",
            deeplinkParameter:""
        },
        // . . .
    }
    
    这给了我们第5项的细节

    windows.折扣
    包含详细项目6的特殊折扣:

    window.discounts = {
        sku140988:{
            SkuId:"sku140988",
            Name:"Ich bin 18-25 Jahre jung",
            Type:"absolute",
            DurationInMonth:"24",
            Value:{
                sku1444295:"-10",   // "Vodafone Red Premium"
                sku1444279:"-10",   // "Vodafone Red M"
                sku1444290:"-20"}   // "Vodafone Red L"
        },
        sku140989:{
            SkuId:"sku140989",
            Name:"Ich habe einen Schwerbehindertenausweis",
            Type:"absolute",
            DurationInMonth:"24",
            Value:{
                sku1444295:"-10",   // "Vodafone Red Premium"
                sku1444279:"-10",   // "Vodafone Red M"
                sku1444290:"-20"}   // "Vodafone Red L"
        },
        sku140990:{
            SkuId:"sku140990",
            Name:"Ich bin Student und jünger als 30",
            Type:"absolute",
            DurationInMonth:"24",
            Value:{
                sku1444295:"-10",   // "Vodafone Red Premium"
                sku1444279:"-10",   // "Vodafone Red M"
                sku1444290:"-20"}   // "Vodafone Red L"
        }
    };
    
    适当的折扣金额由计划主要SKU选择(通过
    值下列出的SKU

    就这样,只要将这5个对象解析成Python对象,就可以得到所需的所有数据

    window.promotions = {
        27:{
            promotionId:"27",
            promotionName:"24 x 5 Euro Smartphone-Rabatt",
            promotionValue:"-5",
            Type:"absolute",
            duration_in_months:"24",
            deeplinkParameter:""
        },
        // . . .
    }
    
    window.discounts = {
        sku140988:{
            SkuId:"sku140988",
            Name:"Ich bin 18-25 Jahre jung",
            Type:"absolute",
            DurationInMonth:"24",
            Value:{
                sku1444295:"-10",   // "Vodafone Red Premium"
                sku1444279:"-10",   // "Vodafone Red M"
                sku1444290:"-20"}   // "Vodafone Red L"
        },
        sku140989:{
            SkuId:"sku140989",
            Name:"Ich habe einen Schwerbehindertenausweis",
            Type:"absolute",
            DurationInMonth:"24",
            Value:{
                sku1444295:"-10",   // "Vodafone Red Premium"
                sku1444279:"-10",   // "Vodafone Red M"
                sku1444290:"-20"}   // "Vodafone Red L"
        },
        sku140990:{
            SkuId:"sku140990",
            Name:"Ich bin Student und jünger als 30",
            Type:"absolute",
            DurationInMonth:"24",
            Value:{
                sku1444295:"-10",   // "Vodafone Red Premium"
                sku1444279:"-10",   // "Vodafone Red M"
                sku1444290:"-20"}   // "Vodafone Red L"
        }
    };