Как попросить f.write () поставить NA, если в BeautifulSoup нет данных? - PullRequest
0 голосов
/ 17 февраля 2019

Моя цель - собрать некоторые конкретные данные на нескольких страницах профиля в ханской академии.И поместите данные в CSV-файл.

Вот код для очистки одной конкретной страницы профиля и помещения его в CSV-файл:

from bs4 import BeautifulSoup
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.khanacademy.org/profile/DFletcher1990/')
r.html.render(sleep=5)

soup=BeautifulSoup(r.html.html,'html.parser')

user_info_table=soup.find('table', class_='user-statistics-table')

dates,points,videos=[tr.find_all('td')[1].text for tr in user_info_table.find_all('tr')]

user_socio_table=soup.find_all('div', class_='discussion-stat')

data = {}
for gettext in user_socio_table:
   category = gettext.find('span')
   category_text = category.text.strip()
   number = category.previousSibling.strip()
   data[category_text] = number

filename = "khanscraptry1.csv"
f = open(filename, "w")
headers = "date, points, videos, questions, votes, answers, flags, project_request, project_replies, comments, tips_thx\n"
f.write(headers)
f.write(dates + "," + points.replace("," , "") + "," + videos + "," + data['questions'] + "," + data['votes'] + "," + data['answers'] + "," + data['flags raised'] + "," + data['project help requests'] + "," + data['project help replies'] + "," + data['comments'] + "," + data['tips and thanks'] + "\n")
f.close()

Этот код отлично работает с этой конкретной ссылкой('https://www.khanacademy.org/profile/DFletcher1990/').

Теперь, когда я меняю ссылку на другой профиль в ханской академии, например: 'https://www.khanacademy.org/profile/Kkasparas/'

, я получаю эту ошибку:

KeyError: 'project help requests'

Это нормально, потому что в этом профиле "https://www.khanacademy.org/profile/Kkasparas/" нет значения project help requestsproject help replies тоже).

Таким образом data['project help requests'] и data['project help replies'] don 'Он существует и поэтому не может быть записан в CSV-файл.

Моя цель - запустить этот скрипт со многими страницами профиля.Поэтому я хотел бы знать, как поставить NA, в каждом случае я не буду получать данные по каждой переменной.А затем выведите te NA в файл csv.

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

Заранее большое спасибоза ваши вклады:)

1 Ответ

0 голосов
/ 17 февраля 2019

Вы можете определить новый список со всеми возможными заголовками и установить значение ключей, которые отсутствуют в 'NA', перед записью его в файл.

full_data_keys=['questions','votes','answers','flags raised','project help requests','project help replies','comments','tips and thanks']
for header_value in full_data_keys:
    if header_value not in data.keys():
        data[header_value]='NA'

Также мягкое напоминание, чтобы предоставитьполностью рабочий код в вашем вопросе.user_socio_table не было определено в вопросе.Я должен был найти ваш предыдущий вопрос, чтобы получить это.

Полный код будет

from bs4 import BeautifulSoup
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.khanacademy.org/profile/Kkasparas/')
r.html.render(sleep=5)
soup=BeautifulSoup(r.html.html,'html.parser')
user_info_table=soup.find('table', class_='user-statistics-table')
dates,points,videos=[tr.find_all('td')[1].text for tr in user_info_table.find_all('tr')]
data = {}
user_socio_table=soup.find_all('div', class_='discussion-stat')
for gettext in user_socio_table:
   category = gettext.find('span')
   category_text = category.text.strip()
   number = category.previousSibling.strip()
   data[category_text] = number
full_data_keys=['questions','votes','answers','flags raised','project help requests','project help replies','comments','tips and thanks']
for header_value in full_data_keys:
    if header_value not in data.keys():
        data[header_value]='NA'
filename = "khanscraptry1.csv"
f = open(filename, "w")
headers = "date, points, videos, questions, votes, answers, flags, project_request, project_replies, comments, tips_thx\n"
f.write(headers)
f.write(dates + "," + points.replace("," , "") + "," + videos + "," + data['questions'] + "," + data['votes'] + "," + data['answers'] + "," + data['flags raised'] + "," + data['project help requests'] + "," + data['project help replies'] + "," + data['comments'] + "," + data['tips and thanks'] + "\n")
f.close()

Ouput - khanscraptry1.csv

date, points, videos, questions, votes, answers, flags, project_request, project_replies, comments, tips_thx
6 years ago,1527829,1123,25,100,2,0,NA,NA,0,0

Переход на следующие строки, если user_info_table отсутствует

if user_info_table is not None:
    dates,points,videos=[tr.find_all('td')[1].text for tr in user_info_table.find_all('tr')]
else:
    dates=points=videos='NA'
...