2015-04-16 5 views
0

Я наткнулся на этот отличный post на соскабливание с использованием Beautiful Soup, и я решил взять на себя задачу соскабливать некоторые данные из Интернета, чтобы попробовать.Скребок с красивым супом

Я использую данные полета от Flight Radar 24 и используя то, что было описано в сообщении в блоге, чтобы попытаться автоматизировать очистку страниц по данным полета.

import requests 
import bs4 

root_url = 'http://www.flightradar24.com' 
index_url = root_url + '/data/flights/tigerair-tgw/' 


def get_flight_id_urls(): 
    response = requests.get(index_url) 
    soup = bs4.BeautifulSoup(response.text) 
    return [a.attrs.get('href') for a in soup.select('div.list-group a[href^=/data]')] 


flight_id_urls = get_flight_id_urls() 
for flight_id_url in flight_id_urls: 
    temp_url = root_url + flight_id_url 
    response = requests.get(temp_url) 
    soup = bs4.BeautifulSoup(response.text) 

try: 
    table = soup.find('table') 
    rows = table.find_all('tr') 
    for row in rows: 
     flight_data = {} 
     flight_data['title'] = soup.select('div#cntPagePreTitle h1')[0].get_text() 
     flight_data['tr'] = row #error here 
     print (flight_data) 

except AttributeError as e: 
    raise ValueError("No valid table found") 

образец flight data page

я споткнулся до стола, а потом понял, что я не знаю, как пробежать вниз таблицу атрибутов, чтобы получить данные, которые были внедренными в каждом столбце.

У любой души есть какие-либо подсказки, даже учебные пособия, чтобы я мог прочитать, как извлечь данные.

P.S: кредиты Miguel Гринберг за отличный учебник

Добавлены

try: 
table = soup.find('table') 
rows = table.find_all('tr') 
heads = [i.text.strip() for i in table.select('thead th')] 
for tr in table.select('tbody tr'): 
    flight_data = {} 
    flight_data['title'] = soup.select('div#cntPagePreTitle h1')[0].get_text() 
    flight_data['From'] = tr.select('td.From') 
    flight_data['To'] = tr.select('td.To') 

    print (flight_data) 

except AttributeError as e: 
    raise ValueError("No valid table found") 

Я изменил последнюю часть моего кода, чтобы сформировать объект данных, но я не могу показаться, чтобы получить данные.

Окончательное редактирование:

import requests 
import bs4 

root_url = 'http://www.flightradar24.com' 
index_url = root_url + '/data/flights/tigerair-tgw/' 


def get_flight_id_urls(): 
    response = requests.get(index_url) 
    soup = bs4.BeautifulSoup(response.text) 
    return [a.attrs.get('href') for a in soup.select('div.list-group a[href^=/data]')] 


flight_id_urls = get_flight_id_urls() 
for flight_id_url in flight_id_urls: 
    temp_url = root_url + flight_id_url 
    response = requests.get(temp_url) 
    soup = bs4.BeautifulSoup(response.text) 

try: 
    table = soup.find('table') 
    rows = table.find_all('tr') 
    for row in rows: 
     flight_data = {} 
     flight_data['flight_number'] = tr['data-flight-number'] 
     flight_data['from'] = tr['data-name-from'] 
     print (flight_data) 

except AttributeError as e: 
    raise ValueError("No valid table found") 

P.S.S: Все благодаря @amow за большую помощь: D

+0

'Я не знаю, как перенести атрибуты таблицы, чтобы получить данные, которые были встроены в каждый столбец. 'Просто разместите исходный код здесь. –

ответ

4

Начните с table как ваш стол в HTML.

heads = [i.text.strip() for i in table.select('thead th')] 
for tr in table.select('tbody tr'): 
    datas = [i.text.strip() for i in tr.select('td')] 
    print dict(zip(heads, datas)) 

Выход

{ 
    u'STD': u'06:30', 
    u'Status': u'Scheduled', 
    u'ATD': u'-', 
    u'From': u'Singapore (SIN)', 
    u'STA': u'07:55', 
    u'\xa0': u'', #This is the last column and have no meaning 
    u'To': u'Penang (PEN)', 
    u'Aircraft': u'-', 
    u'Date': u'2015-04-19' 
} 

Если вы хотите, чтобы получить данные в т.р. метки. Просто используйте

tr['data-data'] tr['data-flight-number'] 

и так далее.

+0

спасибо за быстрый ответ, я вижу, что вы удаляете данные из каждого столбца в массив, возможно ли получить каждый столбец с указанием столбца, я попробую 'flight_data ['From'] = tr.select ('td.From ') ', но это ничего не дает. – jonleech

+1

@jonleech Конечно, вы можете, но функция 'select' поддерживает только синтаксис' css'. Поэтому, если вы хотите получить 'from location', вы можете использовать' tr.select ('td') [1] '. Поскольку нет определенного идентификатора 'location td', вы можете использовать только индекс списка, который denpends в индексе столбца' location' в таблице.Btw, 'from location' также может быть найден как атрибут из 'tr', просто используйте' tr ['data-name-from'] ' – amow

+0

@jonleech Ключи вывода json поступают из заголовка таблицы, а не из столбца td.So, я думаю, когда вы используете' tr.select ('td.From') ', вы ошибаетесь' From' как attr 'td'. Это не так. Вы можете использовать элемент проверки chrome' chrome 'в меню правой кнопки мыши, чтобы узнать, как найти каждый элемент в html док. – amow