View difference between Paste ID: YwxHeKDT and FQGSCi3z
SHOW: | | - or go back to the newest paste.
1
## for https://stackoverflow.com/q/75828625/6146136
2
3
import pandas as pd
4-
import requests
4+
5
output_fp = 'digital-innovation-hubs.csv'
6-
from bs4 import BeautifulSoup
6+
dfList, pg_num, max_pg = [], 0, None
7
base_url = 'https://s3platform.jrc.ec.europa.eu/digital-innovation-hubs-tool'
8-
def get_row_dict(trTag):
8+
while (pg_num:=pg_num+1) and (not isinstance(max_pg,int) or pg_num<max_pg):
9-
    row = { td['data-ecl-table-header']: td.get_text(' ', strip=True) 
9+
    pg_url = f'{base_url}?_eu_europa_ec_jrc_dih_web_DihWebPortlet_cur={pg_num}'
10-
            for td in trTag.select('td[data-ecl-table-header]')} 
10+
    # try: dfList += pd.read_html(pg_url, extract_links='all')[:1] ## [needs v1.5.0.]
11-
    for td in trTag.select('td[data-ecl-table-header]:has(a[href])'):
11+
    try: dfList += pd.read_html(pg_url)[:1]
12-
        k, link = td['data-ecl-table-header'], td.find('a',href=True)['href']
12+
    except Exception as e: pg_num, _ = -1, print(f'\n{e!r} from {pg_url}')
13-
        if k=='Email' and link.startswith('mailto:'):
13+
    else: print('', end=f'\rScraped {len(dfList[-1])} rows from {pg_url}')
14-
            link = link.replace('mailto:', '', 1)
14+
15-
        row[(k.split()[0]+' Link') if row[k] else k] = link
15+
# pd.concat(dfList).to_csv(output_fp, index=False) ## save without page numbers
16-
    return row 
16+
df=pd.concat(dfList, keys=list(range(1,len(dfList)+1)),names=['from_pg','pgi'])
17
df.reset_index().drop('pgi',axis='columns').to_csv(output_fp, index=False)