почему веб-очистка с помощью Robobrowser в Python вызывает "Задача была уничтожена, но она ожидает выполнения!" - PullRequest
0 голосов
/ 22 января 2019

Я пишу код для бота Discord, который ищет разные игровые сайты. Он ищет изображение и описание в html-странице, используя Robobrowser.

Раньше у меня не было проблем. Однако я только что добавил чехол для Google Play Store, и теперь он говорит мне: «Задача была уничтожена, но она ожидает выполнения!» когда он пытается получить эти предметы через ссылку GPS.

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

Вот мой код:

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

def get_embed_caption(url):
    print("Getting caption")
    desc = None
    if url != "No Link":
        try:
            browser.open(url)
            desc = "something"
        except:
            print("Caption ERROR with url")
            desc = None
        if desc != None:
            if "itch.io" in url and " " not in url:
                parse = browser.parsed
                parse = str(parse)

                pos2 = parse.find("og:description")
                pos1 = parse.rfind('content=', 0, pos2)

                desc_type = parse[pos1+8:pos1+9]

                pos2 = parse.rfind(desc_type, 0, pos2-2)
                pos1 = parse.find(desc_type, pos1)
                desc = parse[pos1+1:pos2]

                if len(desc) > 1000:
                    desc = desc[:1000]
                if "/><" in desc:
                    pos = parse.find("formatted_description user_formatted")
                    pos = parse.find("<p>", pos)
                    desc = parse[pos+3:parse.find('</p>', pos)]
            elif "steam" in url and " " not in url:
                parse = browser.parsed
                parse = str(parse)
                pos = parse.find("game_description_snippet")
                pos = parse.find('"', pos)
                pos = parse.find('>', pos)
                desc = parse[pos+1:parse.find('<', pos+1)]
            elif "play.google" in url and " " not in url:
                parse = browser.parsed
                parse = str(parse)
                pos = parse.find('aria-label="Description"')
                print(parse[pos:pos+20])
                pos = parse.rfind("content", 0, pos)
                print(parse[pos:pos+20])
                pos = parse.find('"', pos)
                print(parse[pos:pos+20])
                desc = parse[pos+1:parse.find('"', pos+1)]
            else:
                print("No caption")
                desc = None

            if desc != None:
                desc = desc.replace("<p>", "")
                desc = desc.replace("</p>", "")
                desc = desc.replace("<em>", "`")
                desc = desc.replace("</em>", "`")
                desc = desc.replace("<br>", "")
                desc = desc.replace("<br/>", "")

    return desc
Task was destroyed but it is pending!
task: <Task pending coro=<Client._run_event() running at C:\Users\Gman\AppData\Local\Programs\Python\Python36\lib\site-packages\discord\client.py:307> wait_for=<Future pending cb=[BaseSelectorEventLoop._sock_connect_done(696)(), <TaskWakeupMethWrapper object at 0x0000000005DEAA98>()]>>

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

1 Ответ

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

В Google Play Store есть много бессмысленного HTML-кода, возможно, из-за этого веб-поиск будет затруднен.Это заняло более 10 секунд для анализа страницы.Однако я не знаю, что заставило задачу уничтожить себя.

Исправление было в том, чтобы использовать библиотеку Python play-scraper, которая была в 20 раз быстрее, а сбор информации занимал менее половины секунды.

...