我尝试使用DOMDocument和Xpath从html元素解析法语文本。问题是输出编码不正确。
这是法文文本:
from os.path import dirname
import my_module
print(dirname(my_module.__file__)) # NOTE: Python 3.x
我在输出中看到的内容:
à la téléchargez mêmes
PHP代码:
à la téléchargez mêmes
感谢您的任何建议。
答案 0 :(得分:2)
使用此命令:
$doc->loadHTML($html);
您要求 DOMDocument 加载字符串$html
$html = '<div id="demo">à la téléchargez mêmes</div>';
使用ISO-8859-1编码。
但是你在那里使用的字符串没有被你自己用ISO-8859-1编码查看/输入,而是用UTF-8编码。
从技术上说,你在那里打错了;)
然后另一方面,当您使用脚本命令返回值时:
$xpath->query("//div[@id='demo']")->item(0)->nodeValue;
that value will be UTF-8 encoded(向下滚动到 Notes 部分,阅读有关字符编码的信息)。
要更好地查看文档,只需在调用loadHTML
后直接输出,以便您可以更好地查看正在进行的操作(echo $doc->saveHTML();
,美化):
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<body>
<div id="demo">
à la téléchargez mêmes
</div>
</body>
</html>
如您所见,您已明确命令插入 Atile 和非破坏空间以及所有其他字符,该字符串被视为HTML 4.0并且由于字符串中的HTML没有指定任何特定的字符编码,因此使用了the default encoding (ISO-8859-1)。
因此,对于您在那里所做的事情,您可以继续阅读涵盖此内容的现有材料,并提供更多信息:
除了answer given in the first of the two之外,还有另外一种方法可以做到这一点:
$saved = libxml_use_internal_errors(true);
$result = $doc->loadHTML('<?xml>' . $html);
########
libxml_use_internal_errors($saved);
if ($result) {
$doc->removeChild($doc->documentElement->previousSibling);
}
此示例不仅添加了正确的错误处理和返回值检查,如果HTML实际上是否可以加载,它还会在字符串前面添加一个将设置{{1}的魔术序列“<?xml>
”进入UTF-8模式。使用UTF-8编码加载HTML字符串后,再次删除 DOMProcessingInstruction 。编码将保留:
loadHTML
在这里通过许多不同的PHP版本在线演示:http://3v4l.org/TT3SM