Edit:
Я нашел ссылки на все, что встроено в тег div в теге ссылки - не зная ajax / front end dev, я не уверен, как вы это называете: выглядит так:
<a class="tabs__link js-tabs-ranking" href="it" data-ajax-stack="{"itg":"\/en\/ajax\/ranking\/19\/itg\/18f11c81b4cd83f7b82b47a88d939a9c\/none","ipg":"\/en\/ajax\/ranking\/19\/ipg\/b1c62bbc714bc8823f59f3ec1030a3d7\/none","etg":"\/en\/ajax\/ranking\/19\/etg\/5b2a3871133c7df8954b81ca884d233f\/none","img":"\/en\/ajax\/ranking\/19\/img\/03a4a10eac4baaffa954cebf29c39b1c\/none","ijg":"\/en\/ajax\/ranking\/19\/ijg\/ec301eb70c0b7df824159aaa00d79135\/none","icg":"\/en\/ajax\/ranking\/19\/icg\/81b5589ac9889472dcda9560dd23683d\/none"}" data-type="g" data-xtclick="ranking::tab::overall">General classification</a>
Я получил следующий код для преобразования таблиц в кадры данных для всех страниц, КРОМЕ которых не существует, где есть несколько таблиц и заголовков - введите ime, ipe - я сделал if-else, чтобы попытаться обработать эти страницы по-разному.
То, что я хотел бы сделать, это поместить каждую таблицу в свой собственный фрейм данных, но я продолжаю получать кучу уродливых html и в конце сообщение об ошибке «TypeError: объект NoneType не вызывается». Я буду продолжать отмахиваться от этого, но любые предложения приветствуются!
import requests
import html5lib
import pandas as pd
from bs4 import BeautifulSoup
#type_dict = {'e':'Stage', 'g':'General Classification'}
tab_dict = {'ite':'Stage',
'ipe':'Points',
'ime':'Mountains',
'ije':'Young riders',
'ice':'Combativity',
'ete':'Teams',
'itg':'General Classification',
'ipg':'Points Classification',
'img':'Mountains Classification',
'ijg':'Young Riders Classification',
'icg':'Combativity Classification',
'etg':'Teams Classification'}
#Add a user input for the URL
start_url = "https://www.letour.fr/en/rankings/stage-19"
base_url = start_url.split('/')[2]
page = requests.get(start_url)
content = page.content
r_table = pd.read_html(content)
#This worked to get the table out into a DataFrame
df = r_table[0]
#print(df['Rider'])
soup = BeautifulSoup(content, "html5lib")
all_links = soup.find_all(class_="tabs__link js-tabs-ranking")
#grabbing the block of ajax links that give URLs to various stage/GC results
for item in all_links:
myurl = item['data-ajax-stack']
myurl = myurl.replace('\/', '/').replace('{', '').replace('}', '').replace('"','')
myurl = dict(x.split(':') for x in myurl.split(','))
#looping through the lists of links and getting the pages
for key, value in myurl.items():
r_type = tab_dict[key]
print("Getting the data for: " + r_type)
url = ("http://" + base_url + value)
try:
if key == "ipe" or key == "ime":
page = requests.get(url).content
print(page)
soup = BeautifulSoup(page, "html5lib")
#heading = soup.find_all('div', class_="rankingTables__caption")
for caption in soup.find_all('div', class_="rankingTables__caption"):
res_caption = caption.text.title()
print(res_caption)
res_table = pd.read_html(caption)
df = res_table[0]
print(df) #debugging, test
else:
page = requests.get(url).content
soup = BeautifulSoup(page, "html5lib")
res_table = pd.read_html(page)
df = res_table[0]
print(df) #debugging/test
except ValueError:
print("No table found for " + key)
break
Я относительно новичок в Python, и я использую проект веб-поиска, чтобы узнать больше. Я застрял в проблеме, пытаясь получить несколько блоков табличных данных с динамической веб-страницы. Есть ли простой способ получить таблицы, сгенерированные из различных кликов на этой странице ?
Мой код ниже работает с результатами, которые появляются при загрузке по умолчанию, но я хочу иметь возможность циклически перемещаться по вкладкам и захватывать их все в одном и том же кадре данных.
Глядя на исходный код, есть один тег, который изменяется в зависимости от вкладки, которую вы нажимаете:
Я думал о создании словаря
data-current-type {'e': 'Stage', 'g': 'General Classification'}
data-current-tab {'it': 'Индивидуальная классификация',
«Ф»: «» Очки,
«Им»: «горы»,
«ij»: «Молодые гонщики»,
'IC': 'боеспособность',
'И др': 'команды'}
Этот дизайн основан на возможности передавать эти различные теги обратно на страницу, и я не думаю, что это сработает.
Глядя на пост, URL генерируются динамически:
https://www.letour.fr/en/ajax/ranking/20/itg/8c7d5ddc44042219f544306cab96c718/subtab
https://www.letour.fr/en/ajax/ranking/20/ipg/2d4afa3722c55ad1564caddee00f117f/subtab
Может ли кто-нибудь указать мне лучший инструмент для получения данных, которые я хочу? Я пытался искать и искать в этом форуме, но я не должен использовать правильные теги ...
import requests
import pandas as pd
start_url = "https://www.letour.fr/en/rankings/stage-20"
page = requests.get(start_url)
content = page.content
#get the table
res_table = pd.read_html(content)
#Define the DataFrame
df = res_table[0]