BeautifulSoup在使用字典的div中提取数据

时间:2017-03-13 00:18:57

标签: python html python-3.x beautifulsoup

嘿我一直试图从html页面中提取时间戳,并且我已经尝试过查看其他方法,但我似乎无法应用于我的案例。我试图接收许多消息的时间戳,但我无法从div中获取数据。

          <div data-sigil="message-text" data-store='{"timestamp":1425541012960,"author":100004932254581,"uuid":"mid.1425541012942:e2ebd68467f39a6954"}' data-store-id="53666">
           <span>
            I'm a antibacterial
           </span>
           <div class="messageAttachments">
           </div>
          </div>

我使用的代码就是这个。

    timestamp = []
    soup = BeautifulSoup(open('Messenger.html', encoding='utf-8'), 'html.parser')
    div = soup.div
    timestamp.append = div.attrs['data-store']
    print(timestamp)

如果有帮助,我还会尝试列出一些时间戳。

编辑:这是我收到的错误消息。

timestamp.append = div.attrs['data-store']
KeyError: 'data-store'

edit2:使用以下两个答案的组合,我得到了它,感谢所有帮助过的人:)

time = soup.find_all('div', {'data-sigil':'message-text'})
#print(len(time))
for i in range(len(time)):
    stamp = ast.literal_eval(time[i].attrs['data-store'])['timestamp']
    timestamp.append(stamp)
    #print(timestamp[i])

2 个答案:

答案 0 :(得分:1)

使用已经讨论过的内容here,您可以使用ast.literal_eval()将字符串转换为实际字典。

以下代码的soup.div.attrs['data-store']部分将从data-store获取div属性,ast.literal_eval()会将字符串转换为实际字典并使用密钥{{然后我们获得相应的值。

['timestamp']

输出:

import ast
from bs4 import BeautifulSoup

timestamp = []
soup = BeautifulSoup(open('Messenger.html', encoding='utf-8'),
                     'html.parser')

stamp = ast.literal_eval(soup.div.attrs['data-store'])['timestamp']

timestamp.append(stamp)
print(timestamp)

答案 1 :(得分:0)

你很可能没有选择你想要的div标签;您可以使用属性来限制选择,例如使用data-store-idfind一起使用,您应该获得此div标记,因为id主要是唯一的:

soup.find('div', {'data-store-id': '53666'}).attrs['data-store']
# '{"timestamp":1425541012960,"author":100004932254581,"uuid":"mid.1425541012942:e2ebd68467f39a6954"}'

更新

使用find_all,您可以使用列表推导并测试div是否具有data-store属性,如果有,则收集时间戳,如果没有,则将其过滤掉:

[div.attrs['data-store'] for div in soup.find_all('div') if div.has_attr('data-store')]
#['{"timestamp":1425541012960,"author":100004932254581,"uuid":"mid.1425541012942:e2ebd68467f39a6954"}']
相关问题