При парсинге сайта обрезаются результаты после 10 строчки

ArturFilipov

Новичок
Пользователь
Авг 13, 2021
3
0
1
1 ОС Windows
2 Версия Python (3.9)
3
C:\Users\Artur>pip list
Package Version
------------------ ---------
beautifulsoup4 4.9.3
certifi 2021.5.30
charset-normalizer 2.0.4
click 8.0.1
colorama 0.4.4
defusedxml 0.7.1
fake-useragent 0.1.11
Flask 2.0.1
grab 0.6.41
idna 3.2
itsdangerous 2.0.1
Jinja2 3.0.1
lxml 4.6.3
MarkupSafe 2.0.1
pip 21.2.3
pyparsing 2.4.7
pytils 0.3
requests 2.26.0
selection 0.0.14
setuptools 56.0.0
six 1.16.0
soupsieve 2.2.1
urllib3 1.26.6
user-agent 0.1.9
weblib 0.1.30
Werkzeug 2.0.1

4 Фрагмент кода Python 3.9
Python:
import requests
from bs4 import BeautifulSoup
import csv


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


def get_page_data (html):
    soup = BeautifulSoup(html, 'lxml')
    trs = soup.find('table',class_='h7vnx2-2 bFpGkc cmc-table').find('tbody')

    for tr in trs:

        tds = tr.find_all('td')
        #print(tds)
        try:
            num = tr.find('div',class_="sc-1teo54s-3 etWhyV").text
            print(num)
        except:
            num = ''
        try:
               name = tds[2].find('a',class_='cmc-link').get('href')  # вытаскиваем название крипты
               name = name[12:].replace('/','')

               print(name)
        except:
               name =''

        try:
                            # вытаскиваем сокращенное имя крипты по первому названию класса
            symbol = tds[2].find('p', class_= 'sc-1eb5slv-0 gGIpIK coin-item-symbol').text

            print(symbol)
        except:
            symbol = ''

        try:
                                 # вытаскиваем сокращенное имя крипты по второму названию класса
            symbol1 = tds[2].find('span', class_= 'crypto-symbol').text
            print(symbol1)

        except:
            symbol = ''
        try:
            price = tds[3].find('a', class_='cmc-link').text   #$46,543.33
            price = price.replace(',', '')                     #$46543.33
            print(price[1:])                                   #46543.33
            
        except:
            price = ''
        try:
               url = 'https://coinmarketcap.com' + tds[2].find('a').get('href')
               print(url)
        except:
               url = ''


    #print(len(trs))
    #print(trs[10])

def main():
    url = 'https://coinmarketcap.com/'
    get_page_data(get_html(url))




if __name__ == '__main__':
    main()

Проблема в том что после 10 строчки таблицы обрезает данные после поиска "TBody", и я не могу вытянуть остальные цены на крипту после 11 строчки. Подскажите пожалуйста. Сравнивал код страницы до 11 строчки и после, сделал корректировку по названию класса, так как он изменился.
 

ArturFilipov

Новичок
Пользователь
Авг 13, 2021
3
0
1
Заметил еще одну особенность на каждой странице выводит нормально первые десять строк, а потом обрезает
 

ArturFilipov

Новичок
Пользователь
Авг 13, 2021
3
0
1
Усовершенствовал код, теперь явно видно что нормально парсит первые 10 строк на странице.
Python:
import requests
from bs4 import BeautifulSoup
import csv


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


def get_page_data (html):
    soup = BeautifulSoup(html, 'lxml')
    trs = soup.find('table',class_='h7vnx2-2 bFpGkc cmc-table').find('tbody')


    for tr in trs:

        tds = tr.find_all('td')
        #print(tds)
        try:
            num = tr.find('div',{'class':"sc-1teo54s-3 etWhyV"}).text
            print(num)
        except:
            num = ''
        try:
               name = tds[2].find('a',class_='cmc-link').get('href')  # вытаскиваем название крипты
               name = name[12:].replace('/','')

               print(name)
        except:
               name =''

        try:
                            # вытаскиваем сокращенное имя крипты по первому названию класса
            symbol = tds[2].find('p', class_= 'sc-1eb5slv-0 gGIpIK coin-item-symbol').text

            print(symbol)
        except:
            symbol = ''

        try:
                                 # вытаскиваем сокращенное имя крипты по второму названию класса
            symbol1 = tds[2].find('span', class_= 'crypto-symbol').text
            print(symbol1)

        except:
            symbol = ''
        try:
            price = tds[3].find('a', class_='cmc-link').text   #$46,543.33
            price = price.replace(',', '')                     #$46543.33
            print(price[1:])                                   #46543.33

        except:
            price = ''
    

    #print(len(trs))
    #print(trs[10])

def main():
    url = 'https://coinmarketcap.com/'
  
    while True:

        soup = BeautifulSoup(get_html(url), 'lxml')
        u = soup.find('ul', class_='pagination').find_all('li', class_='page')
        print(u)
        try:
            pattern = 'https://coinmarketcap.com?page={}'
            url = u[-1].find('a').get('href')  # /?page=61
            n = url[7:]  # 61
            for i in range(1, int(n),1):
                url = pattern.format(str(i))
                print(url)
                get_page_data(get_html(url))
        except: url = 'https://coinmarketcap.com'


if __name__ == '__main__':
    main()
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
на каждой странице выводит нормально первые десять строк, а потом обрезает
Так происходит потому, что верстка первых десяти строк таблицы отличается от последующих.
Чтобы исправить можно заменить эту строку кода:
Python:
price = tds[3].find('a', class_='cmc-link').text
на такую
Python:
price = tds[3].text
 

Форум IT Специалистов