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?
 
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!
 
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?
 
Strano a me il tuo script funziona , wamp in locale, dopo lo provo anche sul server
 
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?
 
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
 
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.
 
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
 
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?
 
E' cambiato l'id della tabella guarda nel sorgente della pagina
 
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/>";
}
 
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:
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:
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">
 
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?
 
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
}
 
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