【问题标题】:Extract Text from Javascript using Python使用 Python 从 Javascript 中提取文本
【发布时间】:2017-02-13 07:03:15
【问题描述】:

我一直在查看如何执行此操作的示例,但无法完全弄清楚。我正在使用 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>

【问题讨论】:

    标签: javascript python beautifulsoup


    【解决方案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']
    

    【讨论】:

    • 是的,bs4 唯一能帮助你做的就是定位这种类型的数据——不过,一旦你找到它,你必须用正则表达式解析它——我发现使用正则表达式 + @987654324 @ 在某些情况下效果很好。
    • 提供的代码绝对有效 - 谢谢。在我的具体示例中,由于我首先使用 bs4 来定位数据,因此生成的数据是 bs4 元素,它不适用于正则表达式。所以我将结果转换为一个字符串,但时间戳之后的一些代码出现了。如何将其限制在原始代码中的“line1”和“options1”之间?我正在尝试的一切都是空的……例如re.findall("'(?=y)'", text), 其中 x='line1' 和 y='options1'
    • 如果有\n,那么你可以text.split('\n')[2].strip(),你会得到line1 = [...];。现在您可以使用切片 [8:-1] 删除 line1 =; 然后结束 - 最后是 text.split('\n')[2].strip()[8:-1]
    【解决方案2】:

    使用正则表达式解析 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]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 2019-05-23
      相关资源
      最近更新 更多