【问题标题】:Getting text/attributes from a script object function in html using Python使用 Python 从 html 中的脚本对象函数获取文本/属性
【发布时间】:2020-11-07 13:59:42
【问题描述】:

我一直在一个需要获取 javascript 的网站上进行网页抓取,以便提取名称、创建日期和一些随机生成的代码等数据,如下所示...

是否有一种有效/任何方式从 html 网页的 <script type="text/javascript"> 中的脚本对象函数中获取文本/属性。

我用 BeautifulSoup 找到了脚本部分,其中嵌入的函数如下:

<script type="text/javascript">

//COMMENT// Some data already here

$(document).ready(function() {
    name.init("<website Link>")
    lang.init("en", "GB")
    data.init("hello", "", "AT3K21SDV", "YIERE34ITEW832WCNG3VMASJKHO345JKRELRK5", "")
});
</script>

具体来说,我需要获取包含AT3K21SDVYIERE34ITEW832WCNG3VMASJKHO345JKRELRK5$(document).ready(function() 部分。

我一直在绞尽脑汁尝试使用这样的索引来获取它; `soup[3:40] 但不起作用

【问题讨论】:

    标签: javascript python html beautifulsoup


    【解决方案1】:

    beautifulsoup 不解析 JavaScript,所以你需要使用其他工具。比如re提取信息:

    import re
    from ast import literal_eval
    
    
    txt = '''<script type="text/javascript">
    
    //COMMENT// Some data already here
    
    $(document).ready(function() {
        name.init("<website Link>")
        lang.init("en", "GB")
        data.init("hello", "", "AT3K21SDV", "YIERE34ITEW832WCNG3VMASJKHO345JKRELRK5", "")
    });
    </script>'''
    
    data = re.search(r'data\.init(\(.*?\))', txt).group(1)
    data = literal_eval(data)
    
    print(data[2], data[3])
    

    打印:

    AT3K21SDV YIERE34ITEW832WCNG3VMASJKHO345JKRELRK5
    

    编辑:如果data.init(...) 内是换行符,则必须在re.search() 中设置flags=re.DOTALL

    import re
    from ast import literal_eval
    
    
    txt = '''<script type="text/javascript">
    
    //COMMENT// Some data already here
    
    $(document).ready(function() {
        ab.info.init("sv", "pp", "f", "NONE",
            "rw", "3r7u6565667",
            "3435345")
    });
    </script>'''
    
    data = re.search(r'info\.init(\(.*?\))', txt, flags=re.DOTALL).group(1)
    data = literal_eval(data)
    
    print(data)
    

    打印:

    ('sv', 'pp', 'f', 'NONE', 'rw', '3r7u6565667', '3435345')
    

    【讨论】:

    • @Legion 如果您收到此错误,则变量 txt 不包含字符串 data.init(...)。您需要检查这种可能性。
    • @Andej Kesely 如果字符串更长呢? mywebsite.data.init(...),那么我包含的搜索是re.search(r'mywebsite\.data\.init(\(.*?\))', txt).group(1),应该是对的..不确定,但可能是因为我在前面的步骤中使用了BeautifulSoup
    • @Legion 是的,你可以这样做。有站点 Regex101,您可以在其中尝试您的正则表达式:regex101.com/r/HjiiGF/1 将字符串和正则表达式放在那里,看看它是否有效。
    • @Andej Kesely 它与缩进格式有关(它认为这是一个中断,如此处所示link 。有没有办法自动重新格式化代码?
    猜你喜欢
    • 2012-04-06
    • 2019-03-20
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多