Не удается найти существующий элемент с тегом, используя Beautifulsoup и запросы - PullRequest
0 голосов
/ 12 марта 2020

Когда я хочу очистить все данные из h https://www.encyclopedia.com/gsearch?q=world+war+2, я не могу найти все элементы. Я специально ищу все внутри элемента a с классом: gs-title (это первая ссылка на новый форум, которая не является спонсорской ссылкой), но когда я очищаю его, он просто говорит, что нашел None. Это мой код:

def scrape_encyclopedia(product_name):
    ### SETUP ###
    URL_raw = 'https://www.encyclopedia.com/gsearch?q=' + product_name
    URL = URL_raw.strip().replace(" ", "+")
    ## gets the html from the url
    try:
        page = requests.get(URL)
    except:
        print("Could not find URL..")

    ## a way to come around scrape blocking
    soup = BeautifulSoup(page.content, 'html.parser')

    parent = soup.find("a", {"class": "gs-title"})
    print(parent)

scrape_encyclopedia('World War 2')

Я думаю, это как-то связано с тем, что он не загружается в начале, когда вы открываете страницу, но я все еще не знаю, как это исправить. Или, может быть, это потому, что сайт использует куки-файлы. Я буквально ищу все идеи, которые я могу получить! Спасибо: D

1 Ответ

0 голосов
/ 12 марта 2020

Причина, по которой вы не видите элемент с классом gs-title, потому что его нет при загрузке (GET) страницы. Ответ просто скелет. После загрузки страницы она выполняет вызовы API и только после получения ответа на этот вызов страница реструктурируется и затем отображаются данные.

Ваша проблема -> Ко времени выполнения вызова API возвращается код python со скелетом html.

Это всегда относится к SPA или приложениям, созданным используя платформы Frontend.

Ваше решение - найти этот вызов API и узнать, как он меняется в зависимости от поискового запроса. (В вашем случае текущий запрос World War 2).

Мне удалось найти этот вызов API.

1012 *https://cse.google.com/cse/element/v1?rsz=filtered_cse&num=10&hl=en&source=gcsc&gss=.com&cselibv=8b2252448421acb3&cx=partner-pub-8594935838850960: 3418779728 & Q = мир% 20war% 202 и безопасные = выкл и cse_tok = AJvRUv3VJzJXI-LILOFzN60EWiCv: 1584040108582 & Exp = csqr, куб.см и обратного вызова = google.search.cse.api7320

Если вы видите, ваш запрос встроен в URL, и когда вы нажмете на него, вы получите файл json, который имеет один ключ с именем results, который является массивом, и внутри которого вы увидите все свои данные.

1 2

Теперь, если это ваш единственный вариант использования, я бы посоветовал вам сделать python requests.get() вызовите этот API, возьмите данные json и дампите их в dict, а затем просмотрите их для своих данных.

Если это не единственный случай, проверьте, как создается URL-адрес API для другого поиска. запросить, а затем сгенерировать это и выполнить команду get и travers results.

Надеюсь, это поможет.

...