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è)如何使用訪問者模式的示例。

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'

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)
添加回答
舉報(bào)