python爬虫获取script标签中的var变量值

发布时间 2023-08-09 15:09:50作者: mingruqi

遇到问题:

资料调研过程中遇到js动态生成页面(在检查中可以看到需要爬取的数据,但是查看网页源代码中都是js动态生成,跟检查中的代码不一致),通过xpath在html中获取不到需要的数据,真正的数据在

 所需要的数据为script中的var indData,数据类型为包含有许多dict的list

解决办法:

可以通过正则在script标签中截取数据,然后转化为json格式的数据。

代码如下:

#此处模拟获取到的html的text
    response_html_str = """
        <!DOCTYPE html>
        <html>
        <head>
        </head>
        <body>
            <script>
                var indData = [{"No": 1, "Status": "A", "Date": "Dec 17, 2004 12:00:00 AM", "Desc": "Dealing in abc", "raCate": null}];
                <!-- 后面接一大堆js函数,巴拉巴拉巴拉...  -->
                function getResultsCount(){
                    return "1";
                }
            </script>
        </body>
        </html>
    """

    soup = BeautifulSoup(response_html_str, "html.parser")
    """
    #compile中的正则
        1."var indData ="表示我们需要开始截取的地方
        2."(.*?)"表示中间为任意字符串
        3.";$"表示第一个;结尾的地方结束
        4."re.MULTILINE",影响^与$ 锚点匹配的位置。
          没有开关,^并且$仅在整个文本的开头和结尾处匹配。使用该开关,它们也将在换行符之前或之后匹配
        5."re.DOTALL",re.DOTALL,影响.模式可以匹配的内容。
          如果没有切换,则.匹配除换行符之外的任何字符。通过该开关,换行符也将匹配
    """

    pattern = re.compile(r"var indData =(.*?);$", re.MULTILINE | re.DOTALL)
    script = soup.find('script', text=pattern)
    data_str = pattern.search(script.text).group(1)
    data_json = json.loads(data_str, strict=False)

结果如下: