【问题标题】:Get JS var value in HTML source using BeautifulSoup in Python在 Python 中使用 BeautifulSoup 获取 HTML 源代码中的 JS var 值
【发布时间】:2017-04-22 13:58:18
【问题描述】:

我正在尝试使用 BeautifulSoup 从 HTML 源代码中获取 JavaScript var 值。

例如我有:

<script>
[other code]
var my = 'hello';
var name = 'hi';
var is = 'halo';
[other code]
</script>

我想要在 Python 中返回 var "my" 的值

我怎样才能做到这一点?

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    以@alecxe 的回答为基础,但考虑更复杂的字典数组或平面 json 对象数组的情况:

    from bs4 import BeautifulSoup
    from slimit import ast
    from slimit.parser import Parser
    from slimit.visitors import nodevisitor
    
    
    data = """
    <script>
    var my = [{'dic1key1':1}, {'dic2key1':1}];
    var name = 'hi';
    var is = 'halo';
    </script>
    """
    
    soup = BeautifulSoup(data, "html.parser")
    
    script = soup.find("script", text=lambda text: text and "var my" in text)
    
    # parse js
    parser = Parser()
    tree = parser.parse(script.text)
    array_items = []
    for node in nodevisitor.visit(tree):
        if isinstance(node, ast.VarDecl) and node.identifier.value == 'my':
            for item in node.initializer.items:
                parsed_dict = {getattr(n.left, 'value', '')[1:-1]: getattr(n.right, 'value', '')[1:-1]
                    for n in nodevisitor.visit(item)
                    if isinstance(n, slimit.ast.Assign)}
            array_items.append(parsed_dict)
    print(array_items)
    

    【讨论】:

      【解决方案2】:

      答案,pattern = re.compile(r"var my = '(.*?)';$", re.MULTILINE | re.DOTALL) 应该是走错路了,同时设置re.MULTILINE re.DOTALL时必须去掉行尾符号$

      尝试使用 python 3.6.4

      【讨论】:

        【解决方案3】:

        另一个想法是使用 JavaScript 解析器 并定位变量声明节点,检查 标识符 是否为所需值并提取 initializer。使用slimit parser 的示例:

        from bs4 import BeautifulSoup
        from slimit import ast
        from slimit.parser import Parser
        from slimit.visitors import nodevisitor
        
        
        data = """
        <script>
        var my = 'hello';
        var name = 'hi';
        var is = 'halo';
        </script>
        """
        
        soup = BeautifulSoup(data, "html.parser")
        
        script = soup.find("script", text=lambda text: text and "var my" in text)
        
        # parse js
        parser = Parser()
        tree = parser.parse(script.text)
        for node in nodevisitor.visit(tree):
            if isinstance(node, ast.VarDecl) and node.identifier.value == 'my':
                print(node.initializer.value)
        

        打印hello

        【讨论】:

        • 当 var 为数组时,此解决方案不起作用:var my = ['hello', 'world']
        【解决方案4】:

        最简单的方法是使用正则表达式模式通过BeautifulSoup定位元素并提取所需的子字符串:

        import re
        
        from bs4 import BeautifulSoup
        
        data = """
        <script>
        [other code]
        var my = 'hello';
        var name = 'hi';
        var is = 'halo';
        [other code]
        </script>
        """
        
        soup = BeautifulSoup(data, "html.parser")
        
        pattern = re.compile(r"var my = '(.*?)';$", re.MULTILINE | re.DOTALL)
        script = soup.find("script", text=pattern)
        
        print(pattern.search(script.text).group(1))
        

        打印hello

        【讨论】:

          猜你喜欢
          • 2016-10-06
          • 2011-11-07
          • 2019-01-02
          • 2021-09-09
          • 2019-07-31
          • 1970-01-01
          • 1970-01-01
          • 2021-07-08
          • 1970-01-01
          相关资源
          最近更新 更多