2016-10-05 84 views
0

我一直在尋找如何做到這一點的例子,但不能完全弄清楚。我使用beautifulsoup來抓取一些數據 - 我可以使用它來查找我想要的數據,但它包含在下面的代碼塊中。我試圖從中提取時間戳信息。我有一種感覺正則表達式在這裏工作,但我似乎無法弄清楚 - 任何建議?從Python使用Python提取文本

<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 = { 
    etc other text 
     } 
    }); 
    </script> 

回答

1

您不能使用BS獲取此數據 - BS只能使用HTML/XML,而不能使用JavaScript。

您必須使用regular expressions或標準字符串函數。


編輯:

text = '''<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 = { 
    etc other text 
     } 
    }); 
    </script>''' 

import re 

re.findall("'([^']*)'", text) 

結果:

['2009-02-23 10 AM', 
'2009-02-08 10 AM', 
'2009-02-09 10 AM', 
'2009-02-22 10 AM', 
'2009-02-21 10 AM', 
'2009-02-20 10 AM'] 
+0

是的,唯一BS4將幫助你要做的就是目標這種類型的數據 - 一旦你找到了,不過,你必須解析它與正則表達式 - 我發現使用正則表達式+ ast.literal_eval在一些情況下運行良好。 – n1c9

+0

提供的代碼絕對有效 - 謝謝。在我的具體示例中,由於我首先使用bs4來定位數據,因此生成的數據是一個bs4元素,它不適用於正則表達式。所以我把結果轉換成一個字符串,但時間戳後的一些代碼出現了。我怎樣才能限制它在代碼中的'line1'和'options1'之間?我正在嘗試的所有東西都是空的。 re.findall(''(?<= x)([^'] *)(?> = y)'「,text),其中x ='line1'和y ='options1' – karty

+0

如果存在'那麼你可以'text.split('\ n')[2] .strip()'並且你得到'line1 = [...];'。現在你可以使用切片'[8:-1]'去除'line1 ='和';'結尾 - 最後'text.split('\ n')[2] .strip()[8:-1 ]' – furas

0

相互替代使用正則表達式來解析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]]