无法使用Beautiful Soup Python从<span>中提取字段

时间:2016-12-22 11:02:31

标签: python beautifulsoup

我必须从HTML页面中提取“公司名称”,“公司类型”字段。我已经能够使用以下代码提取公司名称:

ol1 = soup.find('ol')
company_box = soup.find_all('span', attrs= {'class': 'company-name'})
for ol in ol1:
    for c in company_box:
        print c.text

我也想提取公司类型。条件是“公司类型”是“私人”,打印“是”否则打印“否”。

在尝试执行此操作时,每次我设法提取公司类型时,都会返回一个空字段。代码块是:

for c in company_box:
    print c.text
    ptype_box = soup.find_all('span', attrs= {'class': 'company-type'})
    print ptype_box

基础网站是fortune.com/best-companies。请帮忙!

1 个答案:

答案 0 :(得分:1)

我们不能将公司类型作为元素。在此站点中,数据通过javascript动态传递和填充。因此,当我们尝试访问公司类型时,它将为空。

在这种情况下,网站将此json数据存储在变量中。所以我们可以使用json.loads()python函数解析json数据并获取所有必需的数据(即公司名称和类型)。

我已经编写了获取公司名称和公司类型的代码。此外,json变量中还有许多其他信息可供查看。希望你觉得它有用。

import requests
import json
from bs4 import BeautifulSoup 

r = requests.get('http://fortune.com/best-companies/')

soup = BeautifulSoup(r.content,'lxml')
data = soup.find_all("script")[-7].string
data = data[39:-12]
d = json.loads(data)

filterd_data = d['bootstrap']['franchise']['filtered_sorted_data']

d = {}
for i in range(100):
    company_data = filterd_data[i]['companies'][0]
    company_type = company_data['type']
    company_name = company_data['term']['name']
    d[company_name] = company_type

print d