Traté de extraer la información de la versión de la página web pero estoy consiguiendo un error a pesar de XPath se ve bien en la página HTML.
Probé código es
use DOMDocument;
use DOMXPath;
function getVersionFromDownloads(string $url): string
{
// support only windows
$content = $this->fetch($url);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);
$content = curl_exec($curl);
curl_close($curl);
$dom = new DOMDocument();
@$dom->loadHTML($content);
$xpath = new DOMXPath($dom);
$result = $xpath->query("//a[contains(text(),'paint.net')]");
$header = $result->item(0)->textContent;
echo $header;
}
getVersionFromDownloads('https://www.dotpdn.com/downloads/pdn.html');
El resultado deseado es 4.2.10
cuando me registré en la página HTML XPath parece ser bueno y que está mostrando el elemento correcto. pero cuando traté de extraer el contenido del texto que da un error.
error de sentencia dada: $header = $result->item(0)->textContent;
Mientras se probaba mis soluciones, que estaba recibiendo una gran cantidad de errores utilizando DOM $dom->load()
. Se puede ver todo el margen de beneficio no válido el uso de un validador de HTML en línea, tales como https://www.freeformatter.com/html-validator.html . Este programa estaba ladrando sobre muchas decprecations menores y luego algunos artículos notables como:
secuencia de bytes con formato incorrecto: “A9”.
y
secuencia de bytes con formato incorrecto: “AE”.
Cuando trataba de mi propia escritura de código PHP con $dom->loadHTML()
...
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->load('https://www.dotpdn.com/downloads/pdn.html');
$xpath = new DOMXPath($dom);
return libxml_get_last_error();
Imprimí el valor de retorno a la pantalla con var_export()
ver:
LibXMLError :: __ set_state (array ( 'nivel' => 3, 'código' => 77, 'columna' => 8, 'message' => 'Fin prematuro de los datos en la etiqueta línea html 1', 'archivo' => ' https://www.dotpdn.com/downloads/pdn.html ', 'línea' => 153,))
RECOMENDADO
Así que en lugar de utilizar load()
, decidí intentar file_get_contents($url)
obtener el código fuente y alimentarlo al analizador DOM.
function getVersionFromDownloads($url)
{
$dom = new DOMDocument();
$dom->loadHTML(file_get_contents($url));
$xpath = new DOMXPath($dom);
$text = $xpath->query("//a[contains(text(),'paint.net')]")->item(0)->textContent;
return preg_replace('/paint\.net\s+/', '', $text);
}
var_export(getVersionFromDownloads('https://www.dotpdn.com/downloads/pdn.html'));
Salida:
'4.2.10'
Para quitar las comillas simples, utilizar
echo
en lugar devar_export()
. Yo sólo se utiliza para demostrar que no hay espacios en blanco iniciales o finales.preg_replace()
se utiliza antes de regresar por lo quepaint.net
siguió por varios espacios en blanco consecutivos dentro de la cadena se eliminan.Para el registro, esta técnica de extracción funcionará de la misma:
$xpath->query("//a[contains(text(),'paint.net')]/text()")->item(0)->nodeValue;
En tus:
function getVersionFromDownloads(string $url): string
las
: string
exigencias que un valor de cadena se devuelve de su función, pero que no son más eco - asegúrese de devolver un valor de cadena.