php - 包含 Unicode 字符的 DOMXPath 查询属性

标签 php html xpath unicode domxpath

是否可以访问包含 Unicode 类名的元素?

其实我是accessing this site , 但它们的类名以 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 code here , 尝试过 \uD83Dap0 也不起作用

最佳答案

好吧,在尝试 $doc->saveHTML() 并注意到所有 Unicode 字符都已损坏之前,我陷入了字符编码和诸如此类的问题。我的猜测是 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,如果你想搜索你可以使用 * 的所有元素。

关于php - 包含 Unicode 字符的 DOMXPath 查询属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55623877/

相关文章:

javascript - HTML5 视频 - 如果当前时间等于设置时间则运行事件

php - PHP错误.htaccess限制文件夹深度

php - DataTables 调整大小的响应问题

html - 带有表情符号的HTML字符串Swift

javascript - 页面加载时默认第一个选项卡处于事件状态

javascript - 有没有什么工具可以智能获取xpath

html - 基于以某些内容开头的 id 属性值的 XPath?

python - 简单的 XPath 表达式在 Python 中不起作用

php - 如何按距离对数据库中的php结果进行排序

php - 为什么不能访问一个类的属性,但是可以访问同一个类的方法?