首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php DOMXpath编码

php DOMXpath编码
EN

Stack Overflow用户
提问于 2012-01-25 04:35:49
回答 2查看 3.5K关注 0票数 1

我需要从网页上抓取一些数据。但我对它有一些编码问题。

这只是一小段示例代码,用来在一个著名的德国网页上显示这个问题。

我原以为会从网页上看到这段文字:

您的位置:我也知道>地区>德国>沃尔夫斯堡>沃尔夫斯堡和VfL。Können dieölner daraus ihren Nutzen ziehen?

但正如你在我的测试中看到的,我得到了这个:

在沃尔夫斯堡的学校里,所有的人都是这样的人,他们的名字是VfL wurde kr?你是不是真的不知道该怎么办?

页面的meta标记表明它是UTF-8编码的……

mb_detect_encoding还说,它是UTF-8。

但是为什么我会收到这条垃圾短信呢?

当我将文本转换为ISO-8859-1时,我得到了预期的结果...

代码语言:javascript
复制
<?php
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';

$url = "http://www.goal.com/de/match/60952/wolfsburg-vs-1-fc-k%C3%B6ln/preview";

$fileContent = @file_get_contents($url);

$dom = @DOMDocument::loadHTML($fileContent);
$xpath = new DOMXpath($dom);

$element = $xpath->query(".//*[@id='article_headline']/h2");
if ($element->length > 0) {
  $item = $element->item(0);

  $text = $item->textContent;
  echo $text . "<br>";

  $text =  iconv("UTF-8", 'ISO-8859-1', $text);
  echo $text . "<br>";
}

?>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-25 10:52:40

如果DOMDocument的html解析器(即libxml2)遇到格式错误的html,它将尝试猜测输入的编码。通常它做得很好,但这个页面似乎是一个病态的案例。也许东亚字符的出现让它感到困惑。

在这样的情况下,您可以在将文本提供给loadHTML()方法之前,将文本强制转换为7位ascii。您可以这样做:

代码语言:javascript
复制
$fileContent = mb_convert_encoding($fileContent, 'HTML-ENTITIES', 'UTF-8');

这会将所有非ascii字符转换为html命名或数字字符实体。当我这样做时,页面对我来说工作正常。

票数 14
EN

Stack Overflow用户

发布于 2012-01-25 08:57:55

页面本身并没有像DOMDocument期望的那样定义字符集。例如:

代码语言:javascript
复制
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

您需要在加载html之前对其进行修补,或者使用其他东西(可能是loadXML,因为它看起来像是xhtml文档?)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8993747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档