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