Атрибут запроса DOMXPath, который содержит символ Unicode - PullRequest
2 голосов
/ 11 апреля 2019

Возможно ли получить доступ к элементу, содержащему имя класса 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 здесь , пробовал с \uD83Dap0, также не работающим

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Ну, я пробежал кроличью нору кодировок символов и еще много чего, прежде чем попытаться $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, если вы хотите найти все элементы, которые вы можете использовать *.

0 голосов
/ 16 апреля 2019

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

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

...