создание веб-страниц, разбивка HTML-таблиц на страницы

#html #python-3.x #web-scraping #beautifulsoup

#HTML #python-3.x #очистка веб-страниц #beautifulsoup

Вопрос:

я хочу извлечь БЕСПЛАТНЫЕ СОВЕТЫ ПО СТАВКАМ на ФУТБОЛ до последней страницы изhttps://oddslot.com/tips / ниже приведен мой код

 import requests
from bs4 import BeautifulSoup
from pandas.io.html import read_html

bet = None




while True:
    if bet:
        page =bet
    else:
        page = 'https://oddslot.com/tips/'
        
    infoboxes = read_html(page, index_col=0, attrs={"class":"table table-hover team-schedule team-schedule--full"})

    file_name = './my_file.csv'
    infoboxes[0].to_csv(file_name, sep=',')
    
    page = requests.get('https://oddslot.com/tips/')
    soup = BeautifulSoup(page.text, 'html.parser')
   
    bet_link = soup.find('a',class_='post-pagination text-center')
    if bet_link:
        bet = bet_link.get('href')
    else:
        break
  

я получаю только первую страницу, как я могу перейти на последнюю страницу?

Комментарии:

1. Просто просмотрите все 100 страниц, которые начинаются с oddslot.com/tips/?page=1 и поменяйте значение местами.

2. цикл for по-прежнему выдает только 1 страницу

Ответ №1:

Ключ в том, чтобы получить все данные со страницы, а затем выполнить цикл по всем страницам. Одним из способов сделать это было бы:

 import csv

import requests
from lxml import html


def extractor(p, x):
    return html.fromstring(p).xpath(x)


def parse_rows(rows):
    d = {}
    for row in rows:
        d["time"] = row.xpath('//*[@class="team-schedule__date"]/strong/text()')
        teams = row.xpath('//*[@class="team-meta__name"]/strong/text()')
        d["home_team"] = teams[1::2]
        d["away_team"] = teams[::2]
        other_info = row.xpath('//*[@class="team-schedule__time"]/strong/text()')
        d["league"] = other_info[::3]  # league name
        d["chance"] = other_info[1::3]  # chance % value
        d["odds"] = row.xpath('//*[@class="team-schedule__time"]/a/strong/text()')
        d["pick"] = other_info[2::3]  # pick
    return d


def page_scraper(page_range):
    for page_number in range(1, page_range   1):
        url = f"https://oddslot.com/tips/?page={page_number}"
        print(f"Fetching data from page: {page_number} / {page_range}")
        response = requests.get(url)
        yield parse_rows(extractor(response.content, "//tbody/tr"))


for page_data in page_scraper(page_range=100):
    with open('odd_slots_tips.csv', 'a') as f:
        w = csv.writer(f)
        for i in zip(*page_data.values()):
            w.writerow(list(i))
  

При этом очищаются все 100 страницы и создается .csv файл с 1000 строками данных (10 записей * 100 страниц).

Образец из файла .csv:

 23:00 GMT,Sao Paulo,Atletico-MG,Brazil: Serie A,67%,1.95,HOME DC
22:00 GMT,Sport Recife,Gremio,Brazil: Serie A,88%,1.32,HOME WIN
18:45 GMT,Hungary,Turkey,Europe: Uefa Nations League - League B,81%,1.52,HOME WIN
...