2016-10-05 17 views
0

私はこれを行う方法の例を見てきましたが、それを理解できません。私はbeautifulsoupを使っていくつかのデータをスクラップしています - 私はそれを使って私が望むデータを見つけることができますが、それは以下のコードブロックに含まれています。私はそれからタイムスタンプ情報を抽出しようとしています。私は正規表現がここで働いているような気がしますが、私はそれを理解することができません - どのような提案?Pythonを使用してJavascriptからテキストを抽出する

<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またはスタンダード文字列関数を使用する必要があります。


EDIT:

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'の間にあるものに限定することができますか?私がしようとしていることはすべて空を生み出しています。 x = 'line1'、y = 'options1' – karty

+0

が存在する場合は、 '\'(?> = y) '"、text) 'n'なら' text.split( '\ n')[2] .strip() 'を実行し、' line1 = [...]; 'を得ることができます。これで最後に 'line1 ='と ';'を削除するために '[8:-1]'スライスを使うことができます。最後に 'text.split( '\ n')[2] .strip()[8:-1 ] ' – furas

0

一つslimitのようなJavaScriptのパーサーを使用することであろうjavascriptのコードを解析するために正規表現を使用する別の代替。ワーキングコード:

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]] 
関連する問題