Scraping contenuto menu e relativi data-value?

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Ciao a tutti,

sto cercando di prelevare tutte le nazioni da questo menu:

attachment.php


attualmente ho fatto questo in javascript ma penso che sia più adatto un linguaggio come PHP, in quanto con javascript devo passare l'html a mano nello script, mentre io voglio scaricare l'intera pagina html e cercare il relativo menu presente nell'immagine.
Una volta fatto questo voglio salvare tutte le nazioni all'interno di un array struttura che sia una specie di:

Codice:
Afghanistan => http://it.soccerway.com/national/afghanistan/afghan-premier-league/2015/regular-season/r32792/
Albania => http://it.soccerway.com/national/albania/super-league/20152016/regular-season/r31891/
Algeria => http://it.soccerway.com/national/algeria/ligue-1/20152016/regular-season/r31583/
...

In particolare viene preso il nome e il relativo link associato nel data-value

Come posso fare questo in PHP?
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
API interessante, sarebbe possibile accedere all'elemento in particolare? Adesso non sono a casa e non posso provarla, magari puoi mostrarmi qualche esempio per favore? Grazie mille!
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Ciao, allora ho scritto un piccolo script che sfrutta queste API solo che ricevo i seguenti errori:

Codice:
Warning: file_get_contents(): php_network_getaddresses: getaddrinfo failed: Host sconosciuto. in C:\Bitnami\wampstack-5.5.27-0\apache2\htdocs\Debug\simplehtmldom_1_5\simple_html_dom.php on line 75

Warning: file_get_contents(http://it.soccerway.com/): failed to open stream: php_network_getaddresses: getaddrinfo failed: Host sconosciuto. in C:\Bitnami\wampstack-5.5.27-0\apache2\htdocs\Debug\simplehtmldom_1_5\simple_html_dom.php on line 75

Fatal error: Call to a member function find() on a non-object in C:\Bitnami\wampstack-5.5.27-0\apache2\htdocs\Debug\index.php on line 8

Ecco il codice:

Codice:
<?php
require_once("simplehtmldom_1_5/simple_html_dom.php");


$html = file_get_html('http://it.soccerway.com/');

// Find all images 
foreach($html->find('img') as $element) 
       echo $element->src . '<br>';

// Find all links 
foreach($html->find('a') as $element) 
       echo $element->href . '<br>';
?>

Ho anche abilitato in php.ini il seguente:

Codice:
php_value allow_url_fopen On;
allow_url_fopen = On;

Riavviato il server ecc..

Cosa posso fare?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Strano a me il tuo script funziona , wamp in locale, dopo lo provo anche sul server
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Ok era un problema di DNS e sono riuscito a risolverlo aggiungendo alcune stringhe prese da stackoverflow.
Comunque, volevo chiederti come posso beccare i nomi di ogni Nazione contenute nel Menu DropDown, attualmente mi esce un casino di roba che non centra nulla con le nazioni se hai provato lo script sicuramente te ne sarai accorto. Puoi dirmi come fare gentilmente?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Devi studiarti bene l'html della pagina e sfruttare il metodo find della classe per riconoscere le select, non è difficile
PHP:
<?php
include "../lib/simple_html_dom.php";

$html = file_get_html('http://it.soccerway.com/');

foreach ($html->find('select.nav-select') as $element)
    echo $element->first_child()->plaintext . '<br>';
?>
una volta riconosciuta la select giusta estrai le option
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
il codice completo potrebbe essere cosi
PHP:
foreach ($html->find('select.nav-select') as $element) {
    if (strpos($element->first_child()->plaintext, "Campionati nazionali") !== false) {
        foreach ($element->find('option') as $option) {
            echo $option->plaintext . " => " . $option->value . "<br/>";
        }
    }
}
era meglio se davano un id alla select.
Ricordati che con questa tecnica lo script potrebbe smettere di funzionare da un momento all'altro : il webmaster cambia il nome della classe della select e non verrà più riconosciuta.
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
il codice completo potrebbe essere cosi
PHP:
foreach ($html->find('select.nav-select') as $element) {
    if (strpos($element->first_child()->plaintext, "Campionati nazionali") !== false) {
        foreach ($element->find('option') as $option) {
            echo $option->plaintext . " => " . $option->value . "<br/>";
        }
    }
}
era meglio se davano un id alla select.
Ricordati che con questa tecnica lo script potrebbe smettere di funzionare da un momento all'altro : il webmaster cambia il nome della classe della select e non verrà più riconosciuta.

Si lo so, io ho già realizzato un'applicazione in vb.net che usa le regex, ma adesso voglio optare per un altra strategia proprio per evitare che a seguito di cambiamenti strutturali il mio codice vada in malora. Comunque grazie per l'aiuto, davvero gentilissimo, ti auguro una buona giornata :D
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
il codice completo potrebbe essere cosi
PHP:
foreach ($html->find('select.nav-select') as $element) {
    if (strpos($element->first_child()->plaintext, "Campionati nazionali") !== false) {
        foreach ($element->find('option') as $option) {
            echo $option->plaintext . " => " . $option->value . "<br/>";
        }
    }
}
era meglio se davano un id alla select.
Ricordati che con questa tecnica lo script potrebbe smettere di funzionare da un momento all'altro : il webmaster cambia il nome della classe della select e non verrà più riconosciuta.

A parte il messaggio che ti ho lasciato in privato, adesso ho un altro problema. Praticamente non riesco a vederee la tabella primo tempo e le altre mi da:

Notice: Undefined offset: 0 in C:\Bitnami\wampstack-5.5.27-0\apache2\htdocs\Debug\championships.php on line 30

Codice:
$html = file_get_html('http://it.soccerway.com/national/italy/serie-a/20152016/regular-season/r31554/?ICID=HP_POP_03');
	$table = $html->find('table#page_competition_1_block_competition_tables_8_block_competition_halftime_table_1_table tbody'); 
	if($html->find('table#page_competition_1_block_competition_tables_8_block_competition_halftime_table_1_table tbody') == true)
	{
		echo "trovato";
	}
	foreach ($table[0]->find('tr') as $row) 
	{ 
		echo $row->plaintext . "<br/>"; 
	}

l'errore proviene da $table[0], cosa sto facendo di sbagliato?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
E' cambiato l'id della tabella guarda nel sorgente della pagina
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
anche l'altro è un problema di selettore, se non indichi correttamente l'elemento da analizzzare nel metodo find la classe non avrà niente su cui lavorare
PHP:
$table = $html->find('table#page_competition_1_block_competition_tables_8_block_competition_league_table_1_table tbody');

foreach ($table[0]->find('tr') as $row) {
    foreach ($row->find('td') as $td) {
        echo $td->plaintext . " | ";
    }
    echo "<br/>";
}
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Non va.. Mi da sempre undefined offset 0, eppure l'id è quello, non capisco cosa possa essere. Puoi darci un occhiata?

Codice:
$html = file_get_html('http://it.soccerway.com/national/italy/serie-a/20152016/regular-season/r31554/?ICID=HP_POP_03');
$table = $html->find('table#page_competition_1_block_competition_tables_8_block_competition_halftime_table_1_table tbody');

	foreach ($table[0]->find('tr') as $row) 
	{
		foreach ($row->find('td') as $td) 
		{
			echo $td->plaintext . " | ";
		}
		echo "<br/>";
	}

PS: Se io volessi saltare un determinato td, per esempio con il class = <td class="direction"> come posso fare? Perché da quanto ho capito posso soltanto accedere per id ma non per class.
 
Ultima modifica:

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Per il problema dell prelevare la classe ho risolto utilizzando il metodo

Codice:
$td->getAttribute('class')

ma rimane ancora il problema del DOM offset..
PS: Ho notato che viene scaricato anche il tfoot della tabella, non so se è un bug della libreria o è normale, per il momento lo salto con una condizione poi se è un problema di codice dimmi tu.
 
Ultima modifica:

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ti sta sfuggendo qualcosa :
nel sorgente di questo link
PHP:
file_get_html('http://it.soccerway.com/national/italy/serie-a/20152016/regular-season/r31554/?ICID=HP_POP_03')
non c'è questo id
Codice:
page_competition_1_block_competition_tables_8_block_competition_halftime_table_1_table
il sorgente della tabella è cosi
HTML:
<table id="page_competition_1_block_competition_tables_8_block_competition_league_table_1_table" class="leaguetable sortable table detailed-table" data-round_id="31554">
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Si è questo il problema, praticamente il la tabella appare quando si fa click sul relativo tab fine primo tempo, lo stesso accade per le altre. Come posso risolvere questo?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
non ho tempo di fare qualche prova ma penso che con una condizione puoi risolvere
Codice:
if(non c'è la tabella completa) {
     cerco quella del primo tempo
}
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
no criric, come ho detto il link della nuova tabella viene creato da qualche script in javascript. Bisognerebbe capire come "assemblare" il link tramite i parametri attuali.
 
Discussioni simili
Autore Titolo Forum Risposte Data
S [PHP] web-scraping PHP 2
S [PHP] recuperare determinato elemento con lo scraping PHP 1
S [PHP] Web Scraping bloccato? PHP 2
JackIlPazzo Effettuare scraping in javascript? Javascript 0
F Scraping pagina Aspx PHP 0
felino Web Scraping: qualche programma usare? Windows e Software 2
IImanuII Web Scraping: manipolazione e info generali. PHP 2
G leggere file txt e stampare con php il contenuto a video PHP 7
Cosina mostrare contenuto da file txt PHP 2
P Passare contenuto in value. Ajax 1
I eliminazione cartella e contenuto PHP 1
A fread non legge il contenuto del file PHP 4
K contenuto javascript scompare inspiegabilmente Javascript 2
M [PHP] Logica esatta sul mostrare contenuto se inattivo con Codeigniter PHP 2
G Pec come leggere il contenuto Posta Elettronica 1
axem [PHP]rendere cliccabile contenuto PHP 10
W Contenuto duplicato su più siti web, quanto è permesso? SEO e Posizionamento 1
E assegnare a una variabile il contenuto di un url (javascript) Javascript 0
M Leggere il contenuto di una cartella e memorizzare il nome file in mysql PHP 1
trattorino [PHP] sql aggiungere dato in una tabella senza cancellare contenuto PHP 6
usura18 [PHP] Perdita contenuto cookie al reload della pagina PHP 6
G [Javascript] Reperire un contenuto con Tampermonkey Javascript 2
C [PHP] Esecuzione comando contenuto in stringa PHP 2
A [Javascript] modificare il contenuto della barra indirizzi di un browser Javascript 1
M Salvataggio contenuto console javascritp in file di testo Presentati al Forum 0
M [Javascript] Visualizza contenuto file XML aggiornato con text scroll Javascript 0
L Aggiungere contenuto con ajax durante lo scroll jQuery 1
C [HTML] Stampo contenuto di una variabile in TEXTAREA allineamento HTML e CSS 1
O Visualizzazione singolo contenuto con php PHP 7
utente è possibile creare una pagina php che copia interamente il contenuto di un'altra pagina ? PHP 10
L [HTML] Adattare bordo al contenuto HTML e CSS 4
F PHP cambio contenuto PHP 4
trattorino [PHP] prendere contenuto dentro un div PHP 3
trattorino [PHP] Prelevare contenuto PHP 1
F [Javascript] Inserire il contenuto di una pagina in un Div Javascript 2
9 inserire contenuto in un file pdf aperto sul browser tramite script php PHP 0
F [Javascript] Div ed iframe che adatta altezza in base al contenuto Javascript 1
S PHP: inviare via email contenuto di una funzione PHP 4
Phyro modificarne il contenuto e alla fine scaricare il file .txtl HTML e CSS 1
F [HTML] Scalare un div ma non il suo contenuto HTML e CSS 1
gandalf1959 Variazione di un campo input in base al contenuto di un altro campo input inserito dall'utente Ajax 4
A caricare file PHP con Load cambiandone parte del contenuto jQuery 1
felino [VbScript] SwfObject: prendere il contenuto di una cella Visual Basic 0
A Ottimizzazione SEO per sito ricco di immagini (e poco contenuto testuale) SEO e Posizionamento 4
P Problema: come memorizzare il contenuto visualizzato di un dvd PHP 6
M Cambiare dinamicamente il contenuto di un DIV Javascript 4
M Comparare se un campo testuale è contenuto in un altro in una query MySQL 0
P Non riesco a capire dove sta l'errore e perchè non mi memorizza il contenuto PHP 14
M ordinamento array file txt in base al contenuto PHP 1
M Mostrare il contenuto del database e convertire la data da timestamp PHP 2

Discussioni simili