使用Python从Javascript中提取文本

时间:2016-10-05 00:32:21

标签: javascript python beautifulsoup

我一直在研究如何做到这一点的例子但却无法弄明白。我使用beautifulsoup来抓取一些数据 - 我可以用它来查找我想要的数据,但它包含在下面的代码块中。我试图从中提取时间戳信息。我有一种感觉正则表达式在这里工作,但我似乎无法弄明白 - 任何建议?

    <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>

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分:1)

使用正则表达式解析javascript代码的另一种方法是使用像slimit这样的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]]