在BeautifulSoup

时间:2015-05-19 15:00:56

标签: python class beautifulsoup

我在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类。任何帮助将不胜感激,我很高兴澄清我错过的任何事情。谢谢!

1 个答案:

答案 0 :(得分:1)

如果缺少类,请使用“.get”获取具有默认值的类。然后检查该值是否与您要排除的值不相符。

像这样(请注意.get('class')返回类中的单词列表而不是字符串):

cols = [ele.text.strip() for ele in cols if ele.get('class',"my default value") != ['quintile', 'detailColumn']]