Очищенные данные веб-сайта не записываются в CSV

#python #selenium #csv #beautifulsoup #webdriverwait

#python #selenium #csv #beautifulsoup #webdriverwait

Вопрос:

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

Я пробовал несколько разных методов, но не могу найти решение. Файл CSV создается, но он просто пустой. Вероятно, есть что-то действительно простое.

 from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import csv
import time
from bs4 import BeautifulSoup

DRIVER_PATH = '/Users/jasonbeedle/Desktop/snaviescraper/chromedriver'

options = Options()
options.page_load_strategy = 'normal'

# Navigate to url
driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("http://best4sport.tv/2hd/2020-12-10/")
options.add_argument("--window-size=1920x1080")
results = driver.find_element_by_class_name('program1_content_container')
soup = BeautifulSoup(results.text, 'html.parser')

# results = driver.find_element_by_class_name('program1_content_container')
p_data1 = soup.find_all("div", {"class_name": "program1_content_container"})
p_data2 = soup.find_all("div", {"class_name": "program_time"})
p_data3 = soup.find_all("div", {"class_name": "sport"})
p_data4 = soup.find_all("div", {"class": "program_text"})

print("Here is your data, I am off ot sleep now see ya ")
print(results.text)
# Create csv
programme_list = []
# Programme List
for item in p_data1:
    try:
        name = item.contents[1].find_all(
            "div", {"class": "program1_content_container"})[0].text
    except:
        name = ''

    p_data1 = [time]
    programme_list.append(p_data1)

# Programme Time
for item in p_data2:
    try:
        time = item.contents[1].find_all(
            "div", {"class": "program_time"})[0].text
    except:
        time = ''

    p_data2 = [time]
    programme_list.append(p_data2)

# Which sport
for item in p_data3:
    try:
        time = item.contents[1].find_all(
            "div", {"class": "sport"})[0].text
    except:
        time = ''

    p_data3 = [time]
    programme_list.append(p_data3)

with open('sport.csv', 'w') as file:
    writer = csv.writer(file)
    for row in programme_list:
        writer.writerow(row)

 

Я только что попытался добавить объект с именем data_output , затем я попытался распечатать data_output

 data_output = [p_data1, p_data2, p_data3, p_data4]
...
print(data_output)
 

Вывод в терминале

Комментарии:

1. как выглядит programme_list переменная, когда она заполнена значениями?

2. 19:55 MOTORU SPORTS Motoru sporta "5 minūte" Iknedēļas Alda Putniņa veidots apskats par motoru sportu 20:00 BASKETBOLS CSKA pret Zielona Gora VTB Vienotās līgas 2020./2021. gada regulārās sezonas spēle (08.12.2020.) 22:00 BASKETBOLS

3. Можете ли вы поделиться своим URL-адресом, если он общедоступен? вы можете использовать pandas для загрузки данных в dataframe , а затем экспортировать в файл csv.

4. best4sport.tv/2hd/2020-12-10 Я никогда не пользовался Pandas буду разбираться в этом

Ответ №1:

Загрузите данные в pandas dataframe и экспортируйте в csv.

 from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
from bs4 import BeautifulSoup

DRIVER_PATH = '/Users/jasonbeedle/Desktop/snaviescraper/chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
driver.get("http://best4sport.tv/2hd/2020-12-10/")
results =WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,".program1_content_container")))
soup = BeautifulSoup(results.get_attribute("outerHTML"), 'html.parser')
program_time=[]
sport=[]
program_text=[]
program_info=[]
for item in soup.select(".program_details "):
    if item.find_next(class_='program_time'):
        program_time.append(item.find_next(class_='program_time').text.strip())
    else:
        program_time.append("Nan")
    if item.find_next(class_='sport'):
        sport.append(item.find_next(class_='sport').text.strip())
    else:
        sport.append("Nan")
    if item.find_next(class_='program_text'):
        program_text.append(item.find_next(class_='program_text').text.strip())
    else:
        program_text.append("Nan")
    if item.find_next(class_='program_info'):
        program_info.append(item.find_next(class_='program_info').text.strip())
    else:
        program_info.append("Nan")

df=pd.DataFrame({"program_time":program_time,"sport":sport,"program_text":program_text,"program_info":program_info})
print(df)
df.to_csv("sport.csv")
 

снимок CSV после создания

введите описание изображения здесь

Если у вас нет pandas, вам необходимо его установить.

pip устанавливает pandas

Комментарии:

1. Я думаю, что люблю тебя. Большое вам спасибо!!! ПОЭТОМУ должны быть такие награды, как Reddit.

2. @JasonBeedle: Рад, что смог вам помочь.

Ответ №2:

Как сказал Blue Fishy, вы можете попытаться перейти только в режим w, но у вас может возникнуть ошибка кодирования.

Решение, которое работает с вашими данными

 import csv 

programme_list = ['19:55','MOTORU SPORTS','Motoru sporta "5 minūte"','Iknedēļas Alda Putniņa veidots apskats par motoru sportu','20:00','BASKETBOLS','...']

with open('sport.csv', 'w', encoding='utf-8') as file:
    writer = csv.writer(file, delimiter=',', lineterminator='n')
    for row in programme_list:
        print(row)
        writer.writerow([row])
 

Вывод

 19:55
MOTORU SPORTS
"Motoru sporta ""5 minūte"""
Iknedēļas Alda Putniņa veidots apskats par motoru sportu
20:00
BASKETBOLS
...
 

Комментарии:

1. Да, это именно то, что я хочу. Хотя мне нужно взять эти извлеченные данные и заполнить programme_list = []

Ответ №3:

Вместо записи двоичного файла вы можете попробовать изменить wb на w?
Изменить

 with open('sport.csv', 'wb') as file:
 

Для

 with open('sport.csv', 'w') as file:
 

ОТРЕДАКТИРОВАНО:

Извините, что немного опоздал. Вот код, измененный на основе вашего исходного кода, к вашему сведению.

 from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import csv
import time
from bs4 import BeautifulSoup

from selenium.webdriver.chrome.options import Options

DRIVER_PATH = '/Users/jasonbeedle/Desktop/snaviescraper/chromedriver'

options = Options()
options.page_load_strategy = 'normal'

# Navigate to url
driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("http://best4sport.tv/2hd/2020-12-10/")
options.add_argument("--window-size=1920x1080")
results = driver.find_element_by_class_name('program1_content_container')
page = driver.page_source
soup = BeautifulSoup(page, 'html.parser')

# results = driver.find_element_by_class_name('program1_content_container')
p_data1 = soup.find_all("p", {"class": "program_info"})
p_data2 = soup.find_all("p", {"class": "program_time"})
p_data3 = soup.find_all("p", {"class": "sport"})
p_data4 = soup.find_all("p", {"class": "program_text"})

# Create csv
programme_list = []
# Programme List
for i in range(len(p_data1)):
    programme_list.append([p_data1[i].text.strip(), p_data2[i].text.strip(), p_data3[i].text.strip(), p_data4[i].text.strip()])
    
with open('sport.csv', 'w', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(["program_info", "program_time", "sport", "program_text"])
    for row in programme_list:
        writer.writerow(row)
 

Скриншот Excel здесь
введите описание изображения здесь

Комментарии:

1. Не могли бы вы поделиться с нами программой, чтобы мы могли помочь вам выявить ошибку?

2. Добавлен код в блок кода в вопросе