Как очистить несколько таблиц с динамической страницы в Python - PullRequest
0 голосов
/ 12 ноября 2018

Edit:

Я нашел ссылки на все, что встроено в тег div в теге ссылки - не зная ajax / front end dev, я не уверен, как вы это называете: выглядит так:

<a class="tabs__link js-tabs-ranking" href="it" data-ajax-stack="{&quot;itg&quot;:&quot;\/en\/ajax\/ranking\/19\/itg\/18f11c81b4cd83f7b82b47a88d939a9c\/none&quot;,&quot;ipg&quot;:&quot;\/en\/ajax\/ranking\/19\/ipg\/b1c62bbc714bc8823f59f3ec1030a3d7\/none&quot;,&quot;etg&quot;:&quot;\/en\/ajax\/ranking\/19\/etg\/5b2a3871133c7df8954b81ca884d233f\/none&quot;,&quot;img&quot;:&quot;\/en\/ajax\/ranking\/19\/img\/03a4a10eac4baaffa954cebf29c39b1c\/none&quot;,&quot;ijg&quot;:&quot;\/en\/ajax\/ranking\/19\/ijg\/ec301eb70c0b7df824159aaa00d79135\/none&quot;,&quot;icg&quot;:&quot;\/en\/ajax\/ranking\/19\/icg\/81b5589ac9889472dcda9560dd23683d\/none&quot;}" 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]

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Я не уверен, что ссылки генерируются динамически. Обновление страницы показывает, что ссылки совпадают.

При этом, возможно, вы захотите извлечь ссылки на основе xpath элементов <a> вкладок.

Так что ваш xpath для получения ссылок может быть диктом:

links_xpath = {
    'climber' : "//a[contains(@class, 'tabs__link') and contains(text(), 'Climber')]/@href",
    'points' : "//a[contains(@class, 'tabs__link') and contains(text(), 'Points')]/@href",
    # etc.
}

Это извлечет ссылку, которую вы затем сможете сопоставить с базовым URL-адресом, и убедитесь, что ваш скребок работает независимо от базовой ссылки, по крайней мере до тех пор, пока макет страницы не может измениться.

0 голосов
/ 12 ноября 2018

Вы можете сделать что-то вроде следующего.Где я зацикливаю предоставленные вами ссылки и объединяю результаты в окончательный фрейм данных.

import pandas as pd
links = ["https://www.letour.fr/en/ajax/ranking/20/itg/8c7d5ddc44042219f544306cab96c718/subtab","https://www.letour.fr/en/ajax/ranking/20/ipg/2d4afa3722c55ad1564caddee00f117f/subtab"]
final = []

for link in links:
    result = pd.read_html(link)
   # print(result)
    header = result[0][0:0]
    final.append(result[0][0:])

df = pd.concat(final, sort=False)
df.drop_duplicates()
df.index = pd.RangeIndex(len(df.index))
print(df)
df.to_csv(r"C:\Users\User\Desktop\test.csv", encoding='utf-8')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...