Autor Zpráva
Patrik C.
Profil *
Dobrý den,

rád bych na web udělal sekci, kde by uživatelé mohli vkládat odkazy na články z jiných webů...

Problém je v tom, že když čtu meta data, nějaký web vyhodí správné kodování a nějaký nikoliv, ikdyž je web v UTF-8...

Kód mám následující, nemá někdo zkušenost ?

Děkuji


$opts = array('http' => array('header' => 'Accept-Charset: UTF-8, *;q=0'));
$context = stream_context_create($opts);

$filename = "https://www.fandimefilmu.cz/";
$content = file_get_contents($filename, false, $context);

$doc = new DOMDocument();

@$doc->loadHTML($content);

$meta = $doc->getElementsByTagName('meta');
foreach ($meta as $element) {
    $tag = [];
    foreach ($element->attributes as $node) {
        $tag[$node->name] = $node->value;
    }
    $tags []= $tag;
}

print_r($tags);
Davex
Profil
DOMDocument používá knihovnu libxml2, která není moc spolehlivá a kódování zjišťuje humpolácky (stačí mít kdekoliv na stránce, i v textu nebo komentářích, řetězce http-equiv content charset=utf-8, přičemž nemusí být u sebe a záleží jen na pořadí). Detekci kódování je lepší udělat vlastní.

V oficiální dokumentaci ke třídě DOMDocument::loadHTML je v komentářích hned několik způsobů, jak stránku v kódování UTF-8 načíst.
N71
Profil *
Jinak ještě bych dodal, že hlavička Accept-Charset nepomůže. Nepoužívá se, prohlížeče ji neposílají. Aby fungovala, musel by mít server cíleně nastavený Content negotiation na tento parametr, což je krajně nepravděpodobné.

Jinak je pravda co píše Davex, donutit DOMDocument ke správnému kódování často vyžaduje jisté zásahy do contentu, který se má načíst.
Kcko
Profil
Patrik C.:
Můžeš zkusit přidat tento řádek:

libxml_use_internal_errors(true);

Já používám něco takového a funguje snad všude kde jsem zatím crawleřil.

libxml_use_internal_errors(true);
$data = file_get_contents("http://...");
$dom = new DOMDocument();
$dom->loadHtml(mb_convert_encoding($data, 'HTML-ENTITIES', 'UTF-8'));
$finder = new DomXPath($dom);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0