首页 > 解决方案 > 如何从html页面中的多个脚本中获取单个脚本变量数据

问题描述

我有一个 html 页面,其中有几个脚本标记,但我只想要这些脚本中的一个变量数据。你可以在这里找到 html 页面代码

https://jsfiddle.net/9Lzc5fxy/

我只想要var roomsAndRatePlans变量的数据,因为但是当我执行下面的代码时,我得到了该脚本标签中的所有数据,任何人都可以帮我解决这个问题

在这里,我编写了用于检索该数据的代码。

f = codecs.open("response.html", 'r')

samplenew = f.read()

selector = scrapy.Selector(text=samplenew, type='html')
snippet = selector.css('script:contains("roomsAndRatesData")::text').get()

jstree = js2xml.parse(snippet)

Data = js2xml.pretty_print(jstree)

但是我总是从包含该变量的脚本标签中获取所有数据,因此我总是在

jstree = js2xml.parse(snippet)

任何人都可以提出任何解决方案,以便我只能检索可变数据“var roomsAndRatePlans”

标签: javascriptpython-2.7xpathscrapy

解决方案


当我需要从 JS 代码中检索一些变量时,我总是使用正则表达式。

你可以用方法实现你想要的re_first

import json

data_str = (selector
    .css('script:contains("roomsAndRatesData")::text')
    .re_first(r'var roomsAndRatePlans = (\{.*\}),'
)
data = json.loads(data_str)

中的对象data将如下所示:

{
    'propertyData': {
        'bookingFeeMessageEnabled': True,
        'breakfastChargeAvailable': True,
        'breakfastIncludedAtProperty': False
    },
    'rooms': {
        '24-285501': {
            'locale': 'en',
            'providerId': '24',
            'roomTypeCode': '285501'
        }
    }
}

PS如果你scrapy只使用它的Selector功能,你可以使用parsel,这是一个scrapy依赖。


推荐阅读