Можно ли получить доступ к элементу, который содержит имя класса Unicode?

Я на самом деле захожу на этот сайт, но их имя класса начинается с символа Unicode U + 1F41D HONEYBEE 🐝

$html = file_get_contents('https://www.honestbee.my/en/groceries/stores/bens-independent-grocer/products/720365');
$doc = new \DOMDocument();
$doc->loadHTML($html);

$xpath = new \DOMXpath($doc);

$elements = $xpath->query("//[@class='🐝ap0']");
if (!is_null($elements)) {
    foreach ($elements as $element) {
        echo "<br/>[". $element->nodeName. "]";

        $nodes = $element->childNodes;
        foreach ($nodes as $node) {
            echo $node->nodeValue. "\n";
        }
    }
}

К сожалению, это вызывает ошибку

ErrorException  : DOMXPath::query(): Invalid expression                                                                                                     
 at /paht/to/test-dom.php:83                                                                        
   79|         $doc->loadHTML($html);                                       
   80|                                                                      
   81|         $xpath = new \DOMXpath($doc);                                
   82|                                                                      
 > 83|         $elements = $xpath->query("//[@class='🐝ap0']");             
   84|         if (!is_null($elements)) {                                   
   85|             foreach ($elements as $element) {                        
   86|                 echo "<br/>[". $element->nodeName. "]";              
   87|                                                                      

Exception trace:

1   DOMXPath::query("//[@class='🐝ap0']")                                  
    /paht/to/test-dom.php:83

Я имел в виду код Emoji здесь, пробовал с {{ X0}} тоже не работает

3
Js Lim 11 Апр 2019 в 05:37

2 ответа

Лучший ответ

Ну, я пробежал кроличью нору кодировок символов и еще много чего, прежде чем попытаться $doc->saveHTML() и заметить, что все символы Юникода были испорчены. Я предполагаю, что DOMDocument::loadHTML рассматривает все как ISO-8859-1, который был кодировкой по умолчанию для HTML 4. Таким образом, добавив пролог XML, мы можем обмануть его как UTF-8. Это позволяет вам искать по имени класса, независимо от того, какие символы он использует:

<?php
$html = file_get_contents('https://www.honestbee.my/en/groceries/stores/bens-independent-grocer/products/720365');
$prologue = '<?xml encoding="UTF-8">';
$doc = new \DOMDocument();
$doc->loadHTML($prologue . $html);
$xpath = new \DOMXpath($doc);
$elements = $xpath->query("//div[@class='🐝ap0']");
foreach ($elements as $element) {
    echo "<br/>[". $element->nodeName. "]";
    $nodes = $element->childNodes;
    foreach ($nodes as $node) {
        echo $node->nodeValue. " \n";
    }
}

Стоит также отметить, что ваша ошибка «неверное выражение» была вызвана не пчелой, а тем, что в вашем запросе не было имени элемента. В своем ответе я использовал div, если вы хотите найти все элементы, которые вы можете использовать *.

2
miken32 12 Апр 2019 в 16:30

На самом деле я использую Rct567 / DomQuery. Автор уже исправил проблему.

Для тех, кто сталкивается с той же проблемой, я рекомендую использовать этот пакет.

0
Js Lim 16 Апр 2019 в 09:56