我正在使用的代码是下面的代码,这个代码完全正常,直到我遇到带有日文字符或任何特殊字符的网址。我观察到了这个问题,似乎每当网址包含日语这样的特殊字符时,它只会返回域名,因此我不断得到我不打算检索的随机结果。
include_once 'simple_html_dom.php';
header('Content-Type: text/html; charset=utf-8');
$url_link = 'http://kissanime.com/Anime/Knights-of-Ramune-VS騎士ラムネ&40FRESH';
$html = file_get_html($url_link);
echo $html->find('.bigChar', 0)->innertext;
我应该得到" Ramune骑士"因为那是我试图检索的元素。相反,$ url_link被重定向到域名,即' http://kissanime.com/'没有'动漫/骑士骑士VS骑士ラムネ&40FRESH'。从那里开始,它会查找具有' .bigChar'的值的类。给出随机值的结果。
答案 0 :(得分:0)
真实问题域是如何使用带有UTF-8字符的网址检索数据,而不是simple_html_dom
。
首先,我们需要对字符进行编码:
$url_link = 'http://kissanime.com/Anime/Knights-of-Ramune-VS騎士ラムネ&40FRESH';
$strPosLastPart = strrpos($url_link, '/') + 1;
$lastPart = substr($url_link, $strPosLastPart);
$encodedLastPart = rawurlencode($lastPart);
$url_link = str_replace($lastPart, $encodedLastPart, $url_link);
Normaly这应该有效。既然我已经测试过了,那就不行了。所以我问为什么会发生这个错误,并使用CURL进行调用。
对象引用未设置为对象的实例。描述:一个 在执行当前Web期间发生了未处理的异常 请求。请查看堆栈跟踪以获取有关的更多信息 错误以及它在代码中的起源。
异常详细信息:System.NullReferenceException:不是对象引用 设置为对象的实例。
现在我们知道,这个页面是用ASP.NET编写的。但我问我,为什么它不起作用。我添加了一个用户代理,瞧:
$ch = curl_init($url_link);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0');
$data = curl_exec($ch);
echo $data;
所有在一起(工作):
$url_link = 'http://kissanime.com/Anime/Knights-of-Ramune-VS騎士ラムネ&40FRESH';
//Encode Characters
$strPosLastPart = strrpos($url_link, '/') + 1;
$lastPart = substr($url_link, $strPosLastPart);
$encodedLastPart = rawurlencode($lastPart);
$url_link = str_replace($lastPart, $encodedLastPart, $url_link);
//Download Data
$ch = curl_init($url_link);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0');
$data = curl_exec($ch);
//Load Data into Html (untested, since i am not using this Lib)
$html = str_get_html($data);
现在的不同之处在于,将$data
读入您的simple_html_dom.php
课程,而不是file_get_html
。
干杯