【问题标题】:Extract data from embedded script tag in html从html中嵌入的脚本标签中提取数据
【发布时间】:2020-01-07 18:11:12
【问题描述】:

我正在尝试在 HTML 中的(大)script 标记内获取数据。通过使用 Beautifulsoup,我可以接近必要的script,但我无法获得我想要的数据。

我在这个标签中寻找的内容位于一个名为“Beleidsdekkingsgraad”的列表中,更具体地说 ["Beleidsdekkingsgraad","107,6","107,6","109,1","109,8","110,1","111,5","112,5","113,3","113,3","114,3","115,7","116,3","116,9","117,5","117,8","118,1","118,3","118,4","118,6","118,8","118,9","118,9","118,9","118,5","118,1","117,8","117,6","117,5","117,1","116,7","116,2"] 更具体;列表中的最后一项 (116,2)

关注12 无法完成此案。

到目前为止我做了什么

base='https://e.infogr.am/pob_dekkingsgraadgrafiek?src=embed#async_embed'
url=requests.get(base)
soup=BeautifulSoup(url.text, 'html.parser')
all_scripts = soup.find_all('script')
all_scripts[3].get_text()[1907:2179]

然而,这并不令人满意,因为每次添加新数字时都必须更改索引。

我正在寻找一种从script 标记中提取列表的简单方法,其次是捕获提取列表的最后一个数字(即 116,2)

【问题讨论】:

    标签: python-3.x web-scraping beautifulsoup


    【解决方案1】:

    您可以正则表达式输出包含该项目的 javascript 对象,然后使用 json 库进行解析

    import requests,re,json
    
    r = requests.get('https://e.infogr.am/pob_dekkingsgraadgrafiek?src=embed#async_embed')
    p = re.compile(r'window\.infographicData=(.*);')
    data = json.loads(p.findall(r.text)[0])
    result = [i for i in data['elements'][1]['data'][0] if 'Beleidsdekkingsgraad' in i][0][-1]
    print(result)
    

    或者用正则表达式做整个事情:

    import requests,re
    
    r = requests.get('https://e.infogr.am/pob_dekkingsgraadgrafiek?src=embed#async_embed')
    p = re.compile(r'\["Beleidsdekkingsgraad".+?,"([0-9,]+)"\]')
    print(p.findall(r.text)[0])
    

    第二个正则表达式:


    另一种选择:

    import requests,re, json
    
    r = requests.get('https://e.infogr.am/pob_dekkingsgraadgrafiek?src=embed#async_embed')
    p = re.compile(r'(\["Beleidsdekkingsgraad".+?"\])')
    print(json.loads(p.findall(r.text)[0])[-1])
    

    【讨论】:

    • 这是一个易于遵循的解决方案,效果很好!通过提供的正则表达式解释,我能够跟踪引擎盖下发生的事情。您和第三种解决方案都很棒。具体来说,我认为第三个是惯用的,对于像我这样的初学者来说很容易理解。
    猜你喜欢
    • 2020-06-18
    • 2020-12-07
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2020-02-19
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多