我在this网站上抓取数据以创建表格。我计划创建一个函数来遍历每个主题,但只测试Accounting&财务第一。到目前为止,我有以下代码:
import os
import requests
from bs4 import BeautifulSoup
import pandas as pd
main_url = 'http://www.thecompleteuniversityguide.co.uk/league-tables/rankings?s=Accounting+%26+Finance'
with requests.Session() as s:
r = s.get(main_url)
soup = BeautifulSoup(r.text, 'html5lib')
title = soup.find('h2').contents[0]
title = " ".join(title.split())
table = soup.find('table', {'class': 'leagueTable hoverHighlight narrow'})
headers = []
rows = []
for row in table.findAll('tr'):
for item in row.findAll('th'):
for link in item.findAll('a', text=True):
headers.append(link.contents[0])
cols = row.find_all('td')
cols = [ele.text.strip() for ele in cols]
rows.append(cols)
for idx, i in enumerate(headers):
if 'Click' in i:
del headers[idx]
for idx, i in enumerate(headers):
if '2016' in i:
del headers[idx]
print headers
print rows
返回
[u'CUG Rank ', u'University Name ', u'Entry Standards', u'Student Satisfaction', u'Research Quality', u'Graduate Prospects', u'Overall Score']
[u'1', u'2', u'Strathclyde', u'517', u'', u'4.14', u'', u'3.17', u'', u'81', u'', u'100.0']
我将在第二个索引中插入一个额外的标题来计算2015专栏,这样就不会出现问题,但问题出在哪里
td class="quintile detailColumn"
因为它们在每个值之后返回null(这些是每个度量下的条形图)。如何在排除td class =" quintile detailColumn"?
的同时刮掉所有其他td我会在findAll中指定要使用的所有类,然后执行“五分之一”。不在,但第二栏(2015)没有td类。任何帮助将不胜感激,我很高兴澄清我错过的任何事情。谢谢!
答案 0 :(得分:1)
如果缺少类,请使用“.get”获取具有默认值的类。然后检查该值是否与您要排除的值不相符。
像这样(请注意.get('class')返回类中的单词列表而不是字符串):
cols = [ele.text.strip() for ele in cols if ele.get('class',"my default value") != ['quintile', 'detailColumn']]