Печать цикла очистки веб-сайта непосредственно в Google Sheets

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

Я могу подтвердить, что соединение с Gspread работает — мой код перебирает имена, но не касается листа.

Я думал, что последняя строка кода (добавление) поместит результаты.

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

Если есть лучший подход, хотелось бы получить любое руководство:

https://docs.google.com/spreadsheets/d/1TD4YmhfAsnSL_Fwo1lckEbnUVBQB6VyKC05ieJ7PKCw/edit#gid=0

import requests
from bs4 import BeautifulSoup

import gspread
gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('1TD4YmhfAsnSL_Fwo1lckEbnUVBQB6VyKC05ieJ7PKCw')
worksheet = sh.sheet1
# AddValue = ["Test", 25, "Test2"]
# worksheet.insert_row(AddValue, 3)


def get_links(url):
    data = []
    req_url = requests.get(url)
    soup = BeautifulSoup(req_url.content, "html.parser")

    for td in soup.find_all('td', {'data-th': 'Player'}):
        a_tag = td.a
        name = a_tag.text
        player_url = a_tag['href']
        print(f"Getting {name}")

        req_player_url = requests.get(
            f"https://basketball.realgm.com{player_url}")
        soup_player = BeautifulSoup(req_player_url.content, "html.parser")
        div_profile_box = soup_player.find("div", class_ = "profile-box")
        row = {"Name": name, "URL": player_url}

        for p in div_profile_box.find_all("p"):
            try:
                key, value = p.get_text(strip=True).split(':', 1)
                row[key.strip()] = value.strip()
            except:     # not all entries have values
                pass

        data.append(row)

    return data


urls = [
    'https://basketball.realgm.com/dleague/players/2022',
]


for url in urls:
    print(f"Getting: {url}")
    data = get_links(url)

    for entry in data:
        worksheet.append_row(entry)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Точки модификации:

  • Когда я увидел ваш скрипт, я подумал, что data из data = get_links(url) — это массив, включающий объект JSON. На текущем этапе append_row не может напрямую использовать объект JSON. Я думал, что это причина вашей текущей проблемы.
  • В вашем сценарии append_row используется в цикле. В этом случае стоимость процесса будет высокой.

Когда эти моменты отразятся в вашем сценарии, как насчет следующей модификации?

От:

for url in urls:
    print(f"Getting: {url}")
    data = get_links(url)

    for entry in data:
        worksheet.append_row(entry)

К:

res = []
for url in urls:
    print(f"Getting: {url}")
    data = get_links(url)
    res = [*res, *data]

if res != []:
    header = list(res[0].keys())
    values = [header, *[[e[k] if e.get(k) else "" for k in header] for e in res]]
    worksheet.append_rows(values, value_input_option = "USER_ENTERED")
  • В этой модификации все значения извлекаются в цикле for. И полученные значения помещаются в электронную таблицу одним вызовом API с помощью append_rows.

Примечание:

  • В этой модификации строка заголовка используется с header = list(res[0].keys()). Если вы хотите использовать ожидаемые упорядоченные заголовки, поместите их вручную в header = list(res[0].keys()).

Ссылка:

удивительное решение. Я вижу, это очень полезно в моем обучении. За последние 6 месяцев я научился безумно многому, и это благодаря таким людям, как вы. Спасибо!

Anthony Madle 24.11.2022 15:19

@Энтони Мэдл Спасибо за ответ. Я рад, что ваша проблема была решена. И тебе спасибо.

Tanaike 25.11.2022 01:10

Другие вопросы по теме