Parser du XML et caractères spéciaux

Petit nouveau ! | 2 Messages

09 oct. 2010, 22:32

Salut à tous !

Je suis en train de faire une moulinette php qui mange une page wikipédia en entrée. Autrement dit, ça commence comme ça :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" dir="ltr"> 
<head> 
<title>Titre de l'article - Wikipédia</title>
Le problème, lorsque j'affiche les 'textNode', c'est qu'ils sont découpés à chaque caractères spéciaux. Le code php (en fin de post) me sort cette réponse :
HTML ( XMLNS=http://www.w3.org/1999/xhtml LANG=fr DIR=ltr )
HEAD ( )
TITLE ( )
Titre de l'article - Wikip
édia
D'où ma question : comment faire pour que le textNode ne soit pas scindé à chaque caractère un peu spécial ?
(Je précise que tout est proprement encodé en UTF-8, sur une machine Windows 7, avec Wamp 2.0 et PHP 5.3.0)

Merci de m'aider !

Mon code php, inspiré de php.net, est celui-ci :
$file = "article.htm"; // Sauvegardé en local le temps de faire les tests
$depth = 0;

function startElement($parser, $name, $attrs) 
{
    echo "$name (";
	foreach($attrs as $key => $val){
		echo " $key=$val";
	}
	echo " )\n";
}

function textElement($parser, $text) 
{
	$text = preg_replace("/^\s+/", "", $text);
	if($text)
		echo "$text\n";
}

function endElement($parser, $name) 
{
    global $depth;
    $depth--;
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_default_handler($xml_parser, "textElement");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

10 oct. 2010, 00:40

Bonjour,

Je ne vais pas répondre à ta question mais ça te ferra peut être gagner du temps, la base de données de Wikipedia est librement téléchargeable pour pouvoir être réutilisée facilement sur ton site, faire un miroir ou autre.
ça sera probablement plus simple que d'essayer d'aspirer le contenu et lorsqu'il changeront le template de page ton aspirateur ne marchera plus.

+ d'infos ici : http://en.wikipedia.org/wiki/Wikipedia: ... e_download
Quand tout le reste a échoué, lisez le mode d'emploi...

ViPHP
ViPHP | 5462 Messages

10 oct. 2010, 00:41

utilise DOMDocument :wink:

Petit nouveau ! | 2 Messages

10 oct. 2010, 11:15

En fait, je veux juste faire un outil pour montrer l'avancement de la saisie des gares ferrovières dans OpenStreetMap.

Du coup, je veux comparer la liste Wikipedia [1] avec les gares saisies dans OSM (obtenues pour l'instant avec une requête hasardeuse). Donc au final, je mouline Wikipedia qu'une seule page, et encore, que de temps en temps.

Enfin, merci pour les solutions, je vais regarder du côté du DOM, ou tester si ma précédente entrée est un textNode, auquel cas je concatène...

Bye

[1] http://fr.wikipedia.org/wiki/Liste_de_gares_de_France