php - query - simplexmlelement::xpath(): undefined namespace prefix
Pregunta PHP & xPath (3)
De acuerdo con la documentación , la verificación " $elements != null
" es innecesaria. DOMXPath::query()
siempre devolverá un DOMNodeList
, aunque tal vez será de longitud cero, lo que no confundirá el bucle foreach
.
Además, tenga en cuenta el uso de la propiedad nodeValue
para obtener la representación textual del elemento:
$elements = $xPath->query("//*[@class=''nombrecomplejo'']");
foreach ($elements as $e) {
echo $e->nodeValue;
}
La razón del error que obtuviste es que no puedes parse_str()
nada más que una cadena a parse_str()
, intentaste pasar un elemento DOMElement
.
Estoy usando PHP y xPath para rastrear en un sitio web que poseo (solo rastreo el html que no va al servidor) pero obtengo este error:
Error fatal capturable: el objeto de la clase DOMNodeList no se pudo convertir a cadena en C: / wamp / www / crawler.php en la línea 46
Ya intenté hacer eco de esa línea para ver lo que obtenía, pero me daría el mismo error. También traté de buscar el error en Google, pero al final terminé en la documentación de php y descubrí que mi ejemplo es exactamente el mismo. uno en la documentación de php, excepto que estoy trabajando con un HTML en lugar de un XML ... así que no tengo idea de lo que está mal ... aquí está mi código ...
<?php
$html = file_get_contents(''http://miurl.com/mipagina#0'');
// create document object model
$dom = new DOMDocument();
// load html into document object model
@$dom->loadHTML($html);
// create domxpath instance
$xPath = new DOMXPath($dom);
// get all elements with a particular id and then loop through and print the href attribute
$elements = $xPath->query("//*[@class=''nombrecomplejo'']");
if ($elements != null) {
foreach ($elements as $e) {
echo parse_str($e);
}
}
?>
Editar
En realidad, sí, lo siento, esa línea era para probar cuando había comentado otras cosas ... La eliminé aquí, aunque todavía tengo el error.
No hay respuestas específicas aquí, solo consejos para la eliminación de errores.
Primero, elimine el @ de
@$dom->loadHTML($html);
Puede ser que haya una advertencia que está suprimiendo aquí que puede ayudarlo a solucionar el problema. El método loadHTML no siempre puede tratar con HTML mal formado. En el ejemplo que publicaste, recibí lo siguiente
PHP Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting '';'' in Entity, line: 109 in /Users/alanstorm/Desktop/foo.php on line 7
Si tiene la capacidad para hacerlo, instale la extensión ordenada y úselo para obtener un documento limpio.
Además, asegúrese de que haya una cadena en $ html. Como está solicitando una página a través de http, es posible que su IP esté bloqueada por algún motivo.
La familia de clases / objetos DOMDocument puede ser difícil de manejar si no está acostumbrado a tratar con interfaces orientadas a objetos totalmente "duras".
Las dos cosas que debes tener en cuenta aquí son
Casi todo lo que devuelve un método DomDocument es un objeto
La mayoría de estos objetos no se pueden convertir a una cadena
Por lo tanto, parece que su código se equivoca cuando intenta convertir una DOMNodeList en una cadena, lo que significa que $ e es una NodeList en lugar de un nodo por algún motivo.
Intente hacer eco de la longitud $ e-> en su lugar para ver si tiene una lista de nodos de una longitud determinada, o iterar sobre $ e para descubrir qué hay dentro de ella. También podría agregar un eco ''.''; a su ciclo y luego cuente los puntos para asegurarse de que su consulta de Xpath devuelva algo de una longitud distinta de cero.
Supongo que su consulta xpath devuelve una lista de nodos vacía aquí. Descargue Firefox xPath Checker y nosotros para ejecutar su consulta xpath en su documento HTML. Eso le permitirá estar seguro de que tiene el xPath correcto, y luego puede concentrarse en descubrir la parte de PHP. Cuando revisé usando su página / código de ejemplo, obtuve un resultado vacío.
¡Buena suerte!
Solo una conjetura descabellada, pero echo $ elements; es la línea 46, ¿verdad? Creo que el comando echo espera algo que sea una cadena o convertible en una cadena, que $ elementos no es. Intenta eliminar esa línea.