|
|
|
|
|
今天需要實現(xiàn)一個簡單的功能,就是用PHP抓網(wǎng)頁內(nèi)容,但是在實際使用時遇到了一個問題,就是無論用何種方法去獲取網(wǎng)頁內(nèi)容,當網(wǎng)址含有中文路徑時就會出錯。
我用了file_get_contents()
和curl
兩種方法,當網(wǎng)址不含中文時,沒有問題,但當網(wǎng)址含有中文,就不行了。
如抓下面這個網(wǎng)頁沒問題
http://howtostagehomes.com/tutorial/
但抓下面這個網(wǎng)頁就抓不到
http://howtostagehomes.com/tutorial/html/tags/按鈕/
有人提到用curl
來抓,添加header頭信息,但是經(jīng)過測試這個方法是無效的。
在測試過程中,我還嘗試過用encode
等網(wǎng)址編碼函數(shù),但還是沒能解決問題。
這個問題看似不大,但解決起來還是煞費心神的。
我又谷歌了一下。
最終找到了問題的解決方法,那就是需要使用下面這個語句,對網(wǎng)址進行轉(zhuǎn)換。
$Url = "http://howtostagehomes.com/tutorial/html/tags/按鈕/";
$Url = iconv('utf-8', 'gbk', $Url); //把utf-8轉(zhuǎn)為gbk
然后用轉(zhuǎn)換后的網(wǎng)址去抓,這樣,無論用何種方法,都能成功抓到想要的網(wǎng)頁了。
iconv編碼格式轉(zhuǎn)換
iconv
函數(shù)可以將一種已知的字符集文件轉(zhuǎn)換成另一種已知的字符集文件。例如:從GB2312轉(zhuǎn)換為UTF-8。
iconv
函數(shù)在php5中內(nèi)置,GB字符集默認打開。
iconv
在轉(zhuǎn)換字符”—”到gb2312時會出錯,解決方法是在需要轉(zhuǎn)成的編碼后加 “//IGNORE”,也就是iconv
函數(shù)第二個參數(shù)后。
添加了字符串 //IGNORE,不能以目標字符集表達的字符將被默默丟棄。 否則,會導(dǎo)致一個 E_NOTICE并返回 false。
代碼如下:
iconv("gb2312", "utf-8//IGNORE", $data) 【把gb2312轉(zhuǎn)換成utf-8】