第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Python - 如何從腳本中的變量內(nèi)部提取數(shù)據(jù)?

Python - 如何從腳本中的變量內(nèi)部提取數(shù)據(jù)?

qq_遁去的一_1 2021-09-11 19:20:46
我是 Python 新手,我正在嘗試使用 BeautifulSoup 從腳本中定義的變量中提取一些數(shù)據(jù)。data = soup.find_all('script', type='text/javascript')print(data[0])<script type="text/javascript">  var myvar = {    productid: "101",    productname: "Abc",  };</script>您知道從 myvar 變量中提取“productid”和“productname”的簡單方法嗎?
查看完整描述

3 回答

?
蠱毒傳說

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

有兩種方法。容易,而且是錯(cuò)誤的?;蛘卟荒敲慈菀祝_。


我不會(huì)向你推薦簡單的方法。正確的方法是使用 Javascript 解析器。對(duì)于現(xiàn)代 Javascript,esprima是一個(gè)不錯(cuò)的選擇。有一個(gè)交互式在線演示,它也可以作為Python 模塊使用。


import esprima


# script body as extracted from beautifulsoup

script_text = """

  var myvar = {

    productid: "101",

    productname: "Abc",

  };

""";


tokens = esprima.tokenize(script_text)

在這個(gè)簡單的腳本中,沒有太多內(nèi)容。原始令牌列表足以獲得您想要的值。它看起來像這樣:


[

    {

        "type": "Keyword",

        "value": "var"

    },

    {

        "type": "Identifier",

        "value": "myvar"

    },

    {

        "type": "Punctuator",

        "value": "="

    },

    {

        "type": "Punctuator",

        "value": "{"

    },

    {

        "type": "Identifier",

        "value": "productid"

    },

    {

        "type": "Punctuator",

        "value": ":"

    },

    {

        "type": "String",

        "value": "\"101\""

    },

    {

        "type": "Punctuator",

        "value": ","

    },

    {

        "type": "Identifier",

        "value": "productname"

    },

    {

        "type": "Punctuator",

        "value": ":"

    },

    {

        "type": "String",

        "value": "\"Abc\""

    },

    {

        "type": "Punctuator",

        "value": ","

    },

    {

        "type": "Punctuator",

        "value": "}"

    },

    {

        "type": "Punctuator",

        "value": ";"

    }

]

迭代列表并選擇您需要的值。


token_iterator = iter(tokens)


for token in token_iterator:

    if token["type"] == "Identifier" and token["value"] == "productname":

        # the token after the next must be the one that holds the associated value

        value_token = next(next(token_iterator))

        productname = value_token["value"]

對(duì)于更復(fù)雜的情況,可能需要將腳本解析為樹并遍歷樹。


tree = esprima.parse(script_text)

該樹更復(fù)雜(您可以在交互式頁面上查看它),但作為交換,它攜帶了普通標(biāo)記列表中缺少的所有上下文信息。然后,您將使用訪問者模式將這棵樹步行到特定位置。如果您有興趣,Python 包中有一個(gè)如何使用訪問者模式的示例。


查看完整回答
反對(duì) 回復(fù) 2021-09-11
?
慕田峪7331174

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊

解析


from bs4 import BeautifulSoup


script_data='''

<script type="text/javascript">

  var myvar = {

    productid: "101",

    productname: "Abc",

  };

</script>

'''

soup = BeautifulSoup(script_data)

soup.script.string將script標(biāo)簽內(nèi)的數(shù)據(jù)保存為字符串。您可以使用split字符串來獲取位置數(shù)據(jù):


soup.script.string.split()

Output:

['var',

 'myvar',

 '=',

 '{',

 'productid:',

 '"101",',

 'productname:',

 '"Abc",',

 '};']

產(chǎn)品編號(hào):


soup.script.string.split()[5].split('"')[1]

Output:

'101'

產(chǎn)品名稱:


soup.script.string.split()[7].split('"')[1]

Output:

'Abc'


查看完整回答
反對(duì) 回復(fù) 2021-09-11
?
慕斯王

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊

對(duì)于簡單的方法,我將使用 Regex


import re


.....

data = soup.find_all('script', type='text/javascript')

productid = re.search(r'productid:\s*"(.*?)"', data[0].text).group(1)

print(productid)


查看完整回答
反對(duì) 回復(fù) 2021-09-11
  • 3 回答
  • 0 關(guān)注
  • 372 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)