with tutorial scraping real examples code python csv web-scraping beautifulsoup html-parsing

python - real - web scraping tutorial



Obtenga contenido de la tabla en BeautifulSoup (2)

Aquí está la idea:

  • leer las celdas de encabezado de la tabla
  • leer todas las otras filas de la tabla
  • comprimir todas las celdas de fila de datos con encabezados produciendo una lista de diccionarios
  • use csv.DictWriter() para volcar en csv

Implementación:

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)

Tengo la siguiente tabla en un sitio web que estoy extrayendo con BeautifulSoup Esta es la url (también he adjuntado una imagen

Idealmente, me gustaría tener a cada compañía en una fila en csv, sin embargo, la obtengo en diferentes filas. Por favor, vea la imagen adjunta.

Me gustaría tenerlo como en el campo "D" pero lo estoy obteniendo en A1, A2, A3 ...

Este es el código que estoy usando para extraer:

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)

Puede alguien ayudar, por favor ?


Dado que @alecxe ya ha proporcionado una respuesta increíble, aquí hay otra toma usando la biblioteca de 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.

Resultado:

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]: