2015-09-07 5 views
4

я следующую таблицу на веб-сайте, который я экстракцию BeautifulSoup Это гиперссылка (я также придает картину enter image description hereПолучить содержимое таблицы в BeautifulSoup

В идеале я хотел бы, чтобы каждая компания в одном строка в формате CSV, однако я получаю его в разных строках. Пожалуйста, смотрите изображение прилагается.

enter image description here

Я хотел бы, чтобы он, как и в поле «D», но я получаю его в A1, A2, A3 ...

Это код, я использую для извлечения:

def _writeInCSV(text): 
    print "Writing in CSV File" 
    with open('sara.csv', 'wb') as csvfile: 
     #spamwriter = csv.writer(csvfile, delimiter='\t',quotechar='\n', quoting=csv.QUOTE_MINIMAL) 
     spamwriter = csv.writer(csvfile, delimiter='\t',quotechar="\n") 

     for item in text: 
      spamwriter.writerow([item]) 

read_list=[] 
initial_list=[] 


url="http://www.nse.com.ng/Issuers-section/corporate-disclosures/corporate-actions/closure-of-register" 
r=requests.get(url) 
soup = BeautifulSoup(r._content, "html.parser") 

#gdata_even=soup.find_all("td", {"class":"ms-rteTableEvenRow-3"}) 

gdata_even=soup.find_all("td", {"class":"ms-rteTable-default"}) 




for item in gdata_even: 
    print item.text.encode("utf-8") 
    initial_list.append(item.text.encode("utf-8")) 
    print "" 

_writeInCSV(initial_list) 

Может кто-то помочь, пожалуйста?

+0

Было бы еще лучше, я мог бы повторить всю таблицу в формате CSV, но я борюсь с тем, как сделать это – Nant

ответ

3

Вот идея:

  • читать ячейки заголовка из таблицы
  • прочитать все остальные строки из таблицы
  • ZIP всех строк данных ячеек с заголовками получения списка словарей
  • использование csv.DictWriter() сваливать в CSV

Реализация:

import csv 
from pprint import pprint 

from bs4 import BeautifulSoup 
import requests 

url = "http://www.nse.com.ng/Issuers-section/corporate-disclosures/corporate-actions/closure-of-register" 
soup = BeautifulSoup(requests.get(url).content, "html.parser") 

rows = soup.select("table.ms-rteTable-default tr") 
headers = [header.get_text(strip=True).encode("utf-8") for header in rows[0].find_all("td")] 

data = [dict(zip(headers, [cell.get_text(strip=True).encode("utf-8") for cell in row.find_all("td")])) 
     for row in rows[1:]] 

# see what the data looks like at this point 
pprint(data) 

with open('sara.csv', 'wb') as csvfile: 
    spamwriter = csv.DictWriter(csvfile, headers, delimiter='\t', quotechar="\n") 

    for row in data: 
     spamwriter.writerow(row) 
1

Поскольку @alecxe уже предоставил удивительный ответ, вот еще один прием с использованием библиотеки pandas.

import pandas as pd 

url = "http://www.nse.com.ng/Issuers-section/corporate-disclosures/corporate-actions/closure-of-register" 
tables = pd.read_html(url) 

tb1 = tables[0] # Get the first table. 
tb1.columns = tb1.iloc[0] # Assign the first row as header. 
tb1 = tb1.iloc[1:] # Drop the first row. 
tb1.reset_index(drop=True, inplace=True) # Reset the index. 

print tb1.head() # Print first 5 rows. 
# tb1.to_csv("table1.csv") # Export to CSV file. 

Результат:

In [5]: runfile('C:/Users/.../.spyder2/temp.py', wdir='C:/Users/.../.spyder2') 
0     Company  Dividend Bonus  Closure of Register \ 
0 Nigerian Breweries Plc   N3.50  Nil 5th - 11th March 2015 
1   Forte Oil Plc   N2.50 1 for 5 1st – 7th April 2015 
2   Nestle Nigeria   N17.50  Nil   27th April 2015 
3  Greif Nigeria Plc  60 kobo  Nil 25th - 27th March 2015 
4  Guaranty Bank Plc N1.50 (final)  Nil   17th March 2015 

0   AGM Date  Payment Date 
0  13th May 2015 14th May 2015 
1 15th April 2015 22nd April 2015 
2  11th May 2015 12th May 2015 
3 28th April 2015  5th May 2015 
4 ​31st March 2015 31st March 2015 

In [6]: 
+0

я получаю ошибку: C: \ python27 \ python.exe C: /Users/Anant/XetraWebBot/Test/ReadCSV.py Traceback (последний последний звонок): Файл «C: /Users/Anant/XetraWebBot/Test/ReadCSV.py», строка 4, в tables = pd.read_html (url) AttributeError: 'module 'object не имеет атрибута' read_html ' – Nant

+0

Вполне возможно, что у вас нет обновленного 'pandas' или у вас нет модуля' html5lib'. Будьте предупреждены: 'pandas' упрощает соскабливание таблиц, как вы можете видеть выше, но настройка его может быть довольно проблемной, если вы не используете дистрибутив, такой как Anaconda (это то, что я использовал для вышеперечисленного). – Manhattan

Смежные вопросы