TransWikia.com

Почему bs4 выводит не то что есть на самом деле в html-коде?

Stack Overflow на русском Asked by SmokeTamer on August 4, 2020

у меня проблема, я пытаюсь спарсить количество страниц на сайте (EKATALOG), и код вроде бы находит что нужно, но данные берутся совсем другие. Подскажите пожалуйста в чем причина и как это исправить?

Мой код:

import requests
from bs4 import BeautifulSoup

URL = "https://ek.ua/list/189/"
HEADERS = {'User-Agent':"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36", "accept":"*/*"}

def get_html(url, page="", params=None):
    req = requests.get(url+str(page)+"/", headers=HEADERS, params=params)
    return req

def get_pages_amount(html):
    soup = BeautifulSoup(html, 'html.parser')
    pagination = (soup.find_all('div', class_="page-num"))[-1].find_all('a', class_='ib')
    print(pagination)
    print(pagination[-1])
    if pagination:
        return int(pagination[-1].get_text())
    else:
        return 1

html = get_html(URL)
if html.status_code == 200:
        pages_count = get_pages_amount(html.text)
        print(pages_count)
        print(f"Парсинг страницы 1 из {pages_count}...")
        html = get_html(URL)
        for page in range(1, pages_count+1):
            print(URL+str(page)+"/")
            print(f"Парсинг страницы {page+1} из {pages_count}...")
            html = get_html(URL,page)
else:
    print("ОШИБОЧКА!!!")

Вывод:

[<a class="ib select" href="/list/189/">1</a>, <a class="ib" href="/list/189/1/" id="pager_1">2</a>, <a class="ib" href="/list/189/2/" id="pager_2">3</a>, <a class="ib" href="/list/189/3/" id="pager_3">4</a>, <a class="ib" href="/list/189/4/" id="pager_4">5</a>, <a class="ib" href="/list/189/10/" id="pager_dots">...</a>, <a class="ib" href="/ek-list.php?katalog_=189&amp;page_=45" id="pager_45">46</a>]
<a class="ib" href="/ek-list.php?katalog_=189&amp;page_=45" id="pager_45">46</a>
amount: 46

А вот что по факту есть в html-коде:
введите сюда описание изображения

По факту страниц больше чем нужно и вообще не понятно откуда bs4 это взяло

One Answer

Можно с нулевой страницы каталога получать последнее число на ней, пример ниже или, например, считать переходы, пока "> / след. страница" не пропадет.

import requests
from bs4 import BeautifulSoup


headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/45.0'}


def get_html(url):
    r = requests.get(url, headers=headers)
    if r.ok:
        return r.text
    print(r.status_code)


def main():
    pattern = 'https://ek.ua/list/185/'
    url = pattern
    get_page_data(get_html(url))


def get_page_data(html):
    soup = BeautifulSoup(html, "lxml")
    pages = str(soup.find_all("div", class_="ib page-num")).split('</a>')
    last_page = pages[-2]
    index_of_symbol = last_page.rfind('>')
    print(last_page[index_of_symbol + 1:])


if __name__ == "__main__":
    main()

Correct answer by Drewleks on August 4, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP