相互替代使用正則表達式來解析JavaScript代碼將使用JavaScript解析器像slimit
。工作代碼:
import json
from bs4 import BeautifulSoup
from slimit import ast
from slimit.parser import Parser
from slimit.visitors import nodevisitor
data = """<script class="code" type="text/javascript">
$(document).ready(function(){
line1 = [['2009-02-23 10 AM', 5203], ['2009-02-08 10 AM', 3898], ['2009-02-09 10 AM', 4923], ['2009-02-22 10 AM', 3682], ['2009-02-21 10 AM', 3238], ['2009-02-20 10 AM', 4648]];
options1 = {};
});
</script>"""
soup = BeautifulSoup(data, "html.parser")
parser = Parser()
tree = parser.parse(soup.script.get_text())
for node in nodevisitor.visit(tree):
if isinstance(node, ast.Assign) and getattr(node.left, 'value', '') == 'line1':
values = json.loads(node.right.to_ecma().replace("'", '"').strip())
print(values)
break
打印Python列表:
[[u'2009-02-23 10 AM', 5203], [u'2009-02-08 10 AM', 3898], [u'2009-02-09 10 AM', 4923], [u'2009-02-22 10 AM', 3682], [u'2009-02-21 10 AM', 3238], [u'2009-02-20 10 AM', 4648]]
是的,唯一BS4將幫助你要做的就是目標這種類型的數據 - 一旦你找到了,不過,你必須解析它與正則表達式 - 我發現使用正則表達式+ ast.literal_eval在一些情況下運行良好。 – n1c9
提供的代碼絕對有效 - 謝謝。在我的具體示例中,由於我首先使用bs4來定位數據,因此生成的數據是一個bs4元素,它不適用於正則表達式。所以我把結果轉換成一個字符串,但時間戳後的一些代碼出現了。我怎樣才能限制它在代碼中的'line1'和'options1'之間?我正在嘗試的所有東西都是空的。 re.findall(''(?<= x)([^'] *)(?> = y)'「,text),其中x ='line1'和y ='options1' – karty
如果存在'那麼你可以'text.split('\ n')[2] .strip()'並且你得到'line1 = [...];'。現在你可以使用切片'[8:-1]'去除'line1 ='和';'結尾 - 最後'text.split('\ n')[2] .strip()[8:-1 ]' – furas