使用PHP抓取页面会导致意外字符
好的,我使用PHP从网页中提取一些数据,并以某种方式引入一些源文档中不存在的意外字符。我认为这是由于我解释了错误的字符编码,尽管我不确定如何解决这个问题 下面是一个HTML示例,给出了错误使用PHP抓取页面会导致意外字符,php,html,character-encoding,web-scraping,Php,Html,Character Encoding,Web Scraping,好的,我使用PHP从网页中提取一些数据,并以某种方式引入一些源文档中不存在的意外字符。我认为这是由于我解释了错误的字符编码,尽管我不确定如何解决这个问题 下面是一个HTML示例,给出了错误 <tr> <td>Aug 2013</td> <td>TEDxColbyCollege</td> <td> <a href="/talks/daniel_h_cohen_for_argumen
<tr>
<td>Aug 2013</td>
<td>TEDxColbyCollege</td>
<td>
<a href="/talks/daniel_h_cohen_for_argument_s_sake.html">Daniel H. Cohen: For argument’s sake</a> </td>
.
.
.
// more of the table
文件的标题表明
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
.
.
</head>
两者都导致输出看起来像这样
danielh.Cohen:For argument€™s sake
尽管在回音时以及在我的数据库表中使用html文档头部的这一行(显示数据时)文本仍然出现配置错误,但请正确呈现“
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
即使正确应用了
htmlspecialchars\u decode()
、html\u entities\u decode()
、以及mb\u convert\u encoding()
,这个问题也很难解决
我使用Sebastián Grignoli的forceUTF8()
函数的修改版本来完全清理字符串。我不知道还有什么比它更适合php的了
您可以找到该函数的一个版本
如果你真的需要一个全面的清理,不管涉及的字符,这会给惊人的结果
以下是来自的示例
用法示例:
$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
示例:
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃédÃération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÃédÃÃération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÃÃédÃÃÃération Camerounaise de Football");
将输出:
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
编辑
另外,请注意,如果使用基于web的DB浏览器(如phpMyAdmin),则在DB中存储的字符编码与网页定义的编码之间可能会遇到字符差异。我曾经遇到过这样的情况:数据库中存储的内容完全正确,但从界面上看似乎是错误的。
$html=file\u get\u contents(“html页面的url\u被废弃”)
是您放置
的页面吗?不,我没有在那里放置任何东西。被废弃的html页面的url处的文档头显示为代码>这就是我真正的意思:)好吧,我不知道这是否适合你,但我有类似的问题,在加载的内容周围放一个utf8_encode()就成功了。我不知道这是否更像是一个未经证实的黑客行为。。。但是试试看:$doc->loadHTML(utf8_encode($html))代码>嘿,谢谢你的主意,但是运气不好,我还是得到了相同的结果。这有帮助吗?谢谢你的建议,我尝试了它,但仍然没有得到正确编码的字符串返回,似乎已经有一个问题在该项目上为它打开,并将继续关注它,以备将来可能使用!很乐意帮忙!此外,如果讨论的开放问题是,我似乎记得使用a将这些字符转换为可管理的字符(即:preg\u replace('/\p{Zs}/','$htmlString)
)。虽然这似乎很奇怪,如果这是你的问题。
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃédÃération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÃédÃÃération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÃÃédÃÃÃération Camerounaise de Football");
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football