如何访问解析后的文本中未显示的li元素?

时间:2018-12-22 11:05:42

标签: python parsing beautifulsoup

我正在尝试做一个简单的html解析练习-获取vsco中用户页面图像的链接。我到了页面列出图像的代码部分(div-> ul-> li),但是由于某种原因,我没有得到应该包含图像的代码的“ li”部分。我究竟做错了什么?我的到目前为止获得ul的代码:

section = soup.find('body').find('div',class_='page-wrap').find('section').find('div',class_='css-1vgyuuf').find('section').find('ul',style='display:flex;justify-content:center')

当我添加find('li')时,什么都没有显示。甚至尝试使用li class属性,但没有任何显示。预先感谢

编辑:链接到vsco页面 https://vsco.co/vsco/journal/p/1

1 个答案:

答案 0 :(得分:0)

此站点的问题是,在页面加载后,您正在使用javascript将您要查找的信息呈现到DOM中。幸运的是,信息仍然在相同的响应中,但是在javascript代码中。

必要信息位于包含script字符串的__PRELOADED_STATE__标记内。稍后,您需要在变量中获取信息并将其解析为json:

import re
import json

...

script_text = soup.find(lambda tag: tag.name=="script" and '__PRELOADED_STATE__' in tag.text)
json_object = re.search('window\.__PRELOADED_STATE__ \= (\{.+\})', str(script_text)).group(1)
info = json.loads(json_object)
for key, article in info['entities']['articles'].items():
    for image in article['body']:
        if type(image['content'][0]) is dict:
            print(image['content'][0]['responsiveUrl'])

这只是一个示例,您可以获取一些图像,info变量中还有更多可用数据,您需要自己检查这些数据。