2016-02-13 2 views
1

код ниже данных передряги со следующей страницы:.. "http://www.gbgb.org.uk/resultsMeeting.aspx?id=136005Scrape HTML в CSV файл

Он царапает все поля Релевента и выводит их на экран, однако я хочу попробовать и распечатать данные в табличная форма в файл csv для экспорта в электронную таблицу или базу данных.

В исходном HTML-тексте оценка, расстояние и призовые места по треку, дате, дате времени (время гонки) взяты из div-класса «resultsBlockheader», и на веб-странице формируется верхняя область карты гонки.

Тело гонки в источнике HTML получается из div-класса «resultsBlock», и это включает в себя финишную позицию (Fin) Greyhound, Trap, SP, Time/Sec и Time distance.

В конце концов, это будет выглядеть как этот

track,date,datetime,grade,distance,prize,fin,greyhound,trap,SP,timeSec,time distance 

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

from urllib import urlopen 
from bs4 import BeautifulSoup 

html = urlopen("http://www.gbgb.org.uk/resultsMeeting.aspx?id=136005") 
bsObj = BeautifulSoup(html, 'lxml') 

nameList = bsObj. findAll("div", {"class": "track"}) 
for name in nameList: 
List = bsObj. findAll("div", {"class": "distance"}) 
for name in nameList: 
    print(name. get_text()) 
nameList = bsObj. findAll("div", {"class": "prizes"}) 
for name in nameList: 
    print(name. get_text()) 
nameList = bsObj. findAll("li", {"class": "first essential fin"}) 
for name in nameList: 
    print(name. get_text()) 
nameList = bsObj. findAll("li", {"class": "essential greyhound"}) 
for name in nameList: 
    print(name. get_text()) 
nameList = bsObj. findAll("li", {"class": "trap"}) 
for name in nameList: 
    print(name. get_text()) 
nameList = bsObj. findAll("li", {"class": "sp"}) 
for name in nameList: 
    print(name. get_text()) 
nameList = bsObj. findAll("li", {"class": "timeSec"}) 
for name in nameList: 
    print(name. get_text()) 
nameList = bsObj. findAll("li", {"class": "timeDistance"}) 
for name in nameList: 
    print(name. get_text()) 

nameList = bsObj. findAll("li", {"class": "essential trainer"}) 
for name in nameList: 
    print(name. get_text()) 

nameList = bsObj. findAll("li", {"class": "first essential comment"}) 
for name in nameList: 
    print(name. get_text()) 

nameList = bsObj. findAll("div", {"class": "resultsBlockFooter"}) 
for name in nameList: 
    print(name. get_text()) 

nameList = bsObj. findAll("li", {"class": "first essential"}) 
for name in nameList: 
    print(name. get_text()) 
+0

Это просто печатает целую кучу вещей каждый на своей собственной линии. Если вам нужен табличный или csv-формат, вам нужно будет переформатировать весь этот код. –

+0

Hi cricket_007.Спасибо за ваш ответ. Как бы я получил материал на экране, чтобы печатать бок о бок (все еще очень новый для всего этого) :) – moonshadow

+0

'print (1,2)' будет печатать на той же строке. 'print (1)' then 'print (2)' будет печатать на новой строке. Так просто. Каждое из них должно быть объединено в списке для печати на одной строке. В настоящее время вы сосредоточены на столбцах вместо строк. –

ответ

1

Не уверен, почему вы не следовали код предложил в this answer для вашего предыдущего вопроса - это фактически решает полей группировки вместе проблему.

Вот прослеживание код, который сбрасывает track, date и greyhound в CSV:

import csv 

from bs4 import BeautifulSoup 
import requests 


html = requests.get("http://www.gbgb.org.uk/resultsMeeting.aspx?id=135754").text 
soup = BeautifulSoup(html, 'lxml') 

rows = [] 
for header in soup.find_all("div", class_="resultsBlockHeader"): 
    track = header.find("div", class_="track").get_text(strip=True).encode('ascii', 'ignore').strip("|") 
    date = header.find("div", class_="date").get_text(strip=True).encode('ascii', 'ignore').strip("|") 

    results = header.find_next_sibling("div", class_="resultsBlock").find_all("ul", class_="line1") 
    for result in results: 
     greyhound = result.find("li", class_="greyhound").get_text(strip=True) 

     rows.append({ 
      "track": track, 
      "date": date, 
      "greyhound": greyhound 
     }) 


with open("results.csv", "w") as f: 
    writer = csv.DictWriter(f, ["track", "date", "greyhound"]) 

    for row in rows: 
     writer.writerow(row) 

Содержание этого results.csv после выполнения кода:

Sheffield,02/02/16,Miss Eastwood 
Sheffield,02/02/16,Sapphire Man 
Sheffield,02/02/16,Swift Millican 
... 
Sheffield,02/02/16,Geelo Storm 
Sheffield,02/02/16,Reflected Light 
Sheffield,02/02/16,Boozed Flame 

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

+0

Да. Просто заметили, сколько вопросов у ОП есть только с этой проблемой. –

+0

Привет, алекс. Большое спасибо за этот код. Я получил все поля, но не могу получить «инструктор» «комментарии» и «первый существенный», поля вне. предложения наиболее приветствуются :) – moonshadow

+0

@moonshadow конечно, давайте избежим решения последующих проблем в комментариях. Посмотрите, имеет ли смысл создавать отдельный вопрос, если вы испытываете трудности с извлечением всех полей. Благодарю. – alecxe

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