Comment loadHTMLFile() lorsqu'il échoue avec "htmlParseEntityRef: aucun nom' erreur?
Je vais essayer d'obtenir la chaîne de caractères "hinson lou ann":
<div class='owner-name'>hinson lou ann</div>
Quand je lance le suivant:
$html = "http://gisapps.co.union.nc.us/ws/rest/v2/cm_iw.ashx?gid=12339";
$doc = new DOMDocument();
$doc->loadHTMLFile($html);
$xpath = new DOMXpath($doc);
$elements = $xpath->query("*/div[@class='owner-name']");
if (!is_null($elements)) {
foreach ($elements as $element) {
echo "<br/>[" . $element->nodeName . "]";
$nodes = $element->childNodes;
foreach ($nodes as $node) {
echo $node->nodeValue . "\n";
}
}
}
J'obtiens une erreur:
Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: htmlParseEntityRef: aucun nom dans http://gisapps.co.union.nc.us/ws/rest/v2/cm_iw.ashx?gid=12339, ligne: 1 /la maison... en ligne ...
Qui se rapporte à la ligne de loadHTMLFILE
.
Remarque: Le fichier n'est pas valide HTML, il ne contient que div
tags! Qu'est-ce que j'ai chargé le fichier, puis giflé le HTMLbody
tag?
Tout d'abord, que la sortie n'est pas valide html.
essayez
Oui mais @RobW est le droit de ses pas valide html....rien de mais des balises div! toutes les idées
Il est votre problème:
Merci!
essayez
$html = file_get_contents('http://gisapps.co.union.nc.us/ws/rest/v2/cm_iw.ashx?gid=12339');
et puis $doc->loadHTMLFile($html);
... c'est comment je gratter ma page web au moinsOui mais @RobW est le droit de ses pas valide html....rien de mais des balises div! toutes les idées
Il est votre problème:
HINSON J MARK & WF LOU ANN G
... &
commence une entité, d'un nu &
devrait être &
. Ah bien, $doc->recover=true;
et tout est 'wellish' (à condition que vous utilisez //div[@class='owner-name']
plutôt */div[@class='owner-name']
que la magie permet de créer des éléments pour rendre réel HTML).Merci!
OriginalL'auteur Josh Cox | 2013-06-27
Vous devez vous connecter pour publier un commentaire.
Si vous vraiment doit essayer de l'analyser, essayez ceci:
PS: Votre XPath était mal, je l'ai corrigé. Votre
$nodes
de ne pas avoir quoi que ce soit parce que l'élément DIV (.owner-name
) n'ont pas d'enfants.. de sorte que vous aurez besoin de réviser.OriginalL'auteur Half Crazed
Simplement générer un document HTML à partir de la source, en l'enveloppant dans les éléments manquants devrait faire l'affaire.
Par exemple:-
OriginalL'auteur Anthony Sterling
Vous obtenez l'erreur, parce que le HTML vous chargez contient les
&
caractère sans être valide en entité HTML. Le Nom de l'entité est mising:Sur le chargement de ces documents, vous verrez une erreur alors dans ces cas (comme vous l'avez écrit):
La
name
se rapporte au nom d'un En Entité HTML (référence), par le modèle:Toutefois, cette erreur ne cause pas de problème afin de charger que HTML. DOMDocument traite très bien avec ce (commun) erreur (Vous risquez de rencontrer un cut-off à la problématique de la position cependant).
De sorte que votre prétention que vous avez besoin de mettre ce fichier dans un
<body>
balise est mal. En HTML,<body>
balise est optionnelle.Concrètement, votre problème est que vous n'étiez pas en mesure de comprendre comment déboguer le fichier HTML après vous avait chargé il en. Utilisez simplement le
saveHTML
méthode à la sortie de ce qui pourrait être chargé avec succès. Cela aurait déjà montré, que l'URL a été chargé avec succès.Qui aurait alors vous a guidé vers le point suivant que l'expression Xpath est faux:
Même si votre nez sur le
<body>
balise n'était pas loin: Même qu'un fragment HTML ne contient pas le<body>
tag, le DOM, pour l'avoir! Mais c'est deux balises à l'intérieur:Le plus souvent la forme courte est d'utiliser
//
qui permet de ne pas exprimer à quel profondeur au niveau de la balise est situé:Voir ainsi:
OriginalL'auteur hakre
Le site distant peut retourner HTML non valide, ce qui provoque cette avertissement.
DOMDocument
etDOMXPath
sont très indulgent en cas d'erreurs HTML. Si il y a juste un avertissement après l'appel deDOMDocument::loadHTML()
et le reste du code produit valide les résultats, je vous conseille de supprimer les avertissements en utilisant le silence de l'opérateur@
:il ne réduire l'erreur, mais pas de sortie
voyez-vous
Parse error
? (Après avoir mis à jour à l'aide de mon exemple)->recover = true;
....Pouvez-vous expliquer? J'attends
recover
êtretrue
par défautOriginalL'auteur hek2mgl