我正在学习PHP编程,我正在测试一些东西。
我一直在尝试下载一些HTML数据:
$this->html = file_get_contents($this->url);
$fh = fopen('txt\htm.txt', 'w') or die("can't open file");
fwrite($fh, $this->html);
fclose($fh);
一旦我运行此脚本,它就会从页面下载HTML并将其保存在文本文件中;到这里一切正常。
在HTML文件中,有一些我想要提取并保存在内存中的数据。
示例:
我使用的代码:(我正在使用XPath)
$doc = new DOMDocument;
@$doc->loadHTML($this->html);
$xpath = new DOMXpath($doc);
$this->string1 = $this->GetName('//div/div[2]/table/tbody/tr[1]/td[1]/a/span',$xpath);
$this->string2 = $this->GetName('//div/div[2]/table/tbody/tr[2]/td[1]/a/span',$xpath);
$this->string3 = $this->GetName('//div/div[2]/table/tbody/tr[3]/td[1]/a/span',$xpath);
$this->string4 = $this->GetName('//div/div[2]/table/tbody/tr[4]/td[1]/a/span',$xpath);
private function GetName($xquery,$xpath)
{
$result_rows = $xpath->query($xquery);
foreach ($result_rows as $result_object)
{
return substr($result_object->nodeValue, strpos($result_object->nodeValue, '>')+1,strlen($result_object->nodeValue) );
}
}
如果我打印:
echo 'tâllian<br>';
echo $this->string1.'<br>';
echo $this->string2.'<br>';
echo $this->string3.'<br>'; //tâllian
echo $this->string4.'<br>';
结果:
所以我的问题是,为什么脚本会返回“t?llian”而不是“tâllian”?
我希望这些问题是由我的函数GetName
引起的......你怎么看?
有趣的事实
echo 'tâllian';
时,它会将其清除并清除,因为我有这个标题:header('Content-Type: text/html; charset=utf-8');
找到解决方案:
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'utf-8');
$doc = new DOMDocument;
@$doc->loadHTML($html);
在创建新的DOMDocument之前需要进行转换。
答案 0 :(得分:0)
如果您使用htmlentities();
方法会怎样?尝试使用以下代码:
echo htmlentities($this->string3) . "<br />";
这可能是因为当您将它们打印为纯文本时,这些特殊字符(在这一个中,带屋顶的A)无法正确打印。您应该将它们打印为HTML实体。下面使用的方法会自动执行此操作。
您可以在PHP页面中找到有关此方法的更多信息:htmlentities
答案 1 :(得分:0)
找到解决方案:
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'utf-8');
$doc = new DOMDocument;
@$doc->loadHTML($html);
在创建新的DOMDocument之前需要进行转换。