solucionar el error de la propiedad XPath XPath a pesar de que se ve bien

mvsr:

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;

mickmackusa:

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 echoen lugar de var_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 que paint.netsiguió 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 : stringexigencias 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=284562&siteId=1
Recomendado
Clasificación