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) |