作者AmuroRai (SIEG ZEON!!!!!!)
看板R_Language
标题[问题] R中文编码(MS950)问题
时间Tue Dec 29 22:03:09 2015
[问题类型]:
程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
[软体熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
最近开始在学用R写爬虫,而今天下午试着要爬证交所的股票代码列表时发现他们似乎
是使用MS950编码,但是这个编码R却无法认得。(参见程式码部分)
後来还有试过用utf-8和big5硬推,也试着用tmcn去转码,但是中文部分还是只得到乱码。
因此想请问是否有什麽方法可以绕过这个问题?
(把原网页资料抓下来存成csv转码後再丢给R不在考虑之列)
[程式范例]:
只附上一开始用MS950的程式码,big5和utf-8的结果大同小异。
另外最後res和ress的output不知道为什麽无法完整贴上,但总之遇到中文都是乱码就是了
> rm(list=ls())
>
> library(tmcn)Q
> library(httr)
> library(rvest)
> library(stringr)
> library(magrittr)
>
> r<-GET("http://isin.twse.com.tw/isin/C_public.jsp?strMode=2")
> r
Response [
http://isin.twse.com.tw/isin/C_public.jsp?strMode=2]
Date: 2015-12-29 10:15
Status: 200
Content-Type: text/html;charset=MS950
Size: 2.69 MB
Unknown encoding MS950. Defaulting to latin1 (ISO-8859-1).
<link rel="stylesheet" href="
http://www.tse.com.tw/style1.css" type=...
<body><table align=center><h2><strong><font class='h1'>¥蠊
> res<-r$content%>%read_html(encoding="MS950")%>%
+ html_node(".h4")%>%html_nodes(xpath="tr")%>%html_text()
> ress<-toUTF8(res)
> res[1:5]
[1] "础粮坛罗\xc3砥国并怏代绣缯瞻\xc3缃名繙\xc3\x99 箪碍坛\xc3斾砥国并怏萤姻砥
'蜃嗽码(ISIN Code)瞻W睑窜瞻蒙睑窜粮茧礼O简瞿缭~礼OCFICode粮\xc3屡腕\xb9"
[2] " 穠\xc3'笨\xbc "
[3] "1101 癒@睑x穠dTW00011010041962/02/09瞻W睑窜瞻系穠d瞻u缭~ESVUFR"
[4] "1102 癒@穑\xc3鱿泥TW00011020021962/06/08瞻W睑窜瞻系穠d瞻u缭~ESVUFR"
[5] "1103 癒@缯\xc3埘泥TW00011030001969/11/14瞻W睑窜瞻系穠d瞻u缭~ESVUFR"
> ress[1:5]
[1] "| 3 睑N绣缯瞻\xc3缃名繙\xc3\x99 箪碍坛\xc3斾
[2] " ªÑ2 ¼ "
[3] "1101 !
[4] "1102 !
[5] "1103 !
[环境叙述]:
Win7 64位元
R 3.2.3 (2015/12/10)
[关键字]:
中文编码 MS950 tmcn
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.109.122.150
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1451397792.A.742.html
1F:→ Wush978: Unknown encoding MS950. Defaulting to latin1 12/29 22:05
2F:→ Wush978: 不知道这行有没有影响 12/29 22:05
3F:→ AmuroRai: 有趣的是好像用content(url,encoding="XXX")结果会和用 12/29 22:06
4F:→ AmuroRai: read_html(encoding="XXX")不太一样...我想我贴上来好了 12/29 22:06
承前面,把r定义出来後实验性的做了以下几种解析方法,结果都有点不同。
如果用content然後强迫编MS950会出现编码不对的状况,但显然改成Big5也不会比较对
(即下面的res1和res2)
而如果使用read_html的话,不论是塞Big5和MS950结果都是一样(res3和res4)
甚至如果是直接把网址塞进read_html并使用Big5的话还会直接出错(res5,这几天在
另一个确定是用Big5编码的网站也出了一样的状况,那个网站後来是靠用content编Big5加
上tmcn的toUTF8解决掉。但这次爬的网页就无法这麽处理)
> res1<-content(r,encoding="MS950")
Unknown encoding MS950. Defaulting to latin1 (ISO-8859-1).
> res2<-content(r,encoding="Big5")
> res3<-r%>%read_html(encoding="Big5")
> res4<-r%>%read_html(encoding="MS950")
> res5<-read_html("http://isin.twse.com.tw/isin/C_public.jsp?strMode=2",
+ encoding="Big5")
错误: input conversion failed due to input error, bytes 0xF9 0xD6 0x3C 0x2F
[6003]
> res2
> res3
{xml_document}
<html>
[1] <head><link rel="stylesheet" href="
http://www.tse.com.tw/style1.css" t ...
[2] <body><table align="center"><h2><strong><font class="h1">骁冕祁上睑窜\xc3
砥国并 ...
> res4
{xml_document}
<html>
[1] <head><link rel="stylesheet" href="
http://www.tse.com.tw/style1.css" t ...
[2] <body><table align="center"><h2><strong><font class="h1">骁冕祁上睑窜\xc3
※ 编辑: AmuroRai (140.109.122.150), 12/29/2015 22:17:04
※ 编辑: AmuroRai (140.109.122.150), 12/29/2015 22:18:42
5F:→ celestialgod: RCurl::getURLContent可以得到正确的文字 12/29 23:06
6F:→ celestialgod: 不过iconv转不了,html parse都会失败(摊手 12/29 23:07
8F:→ celestialgod: 一样的连结 12/29 23:29
9F:→ AmuroRai: 谢谢楼上W大和C大,晚点我找些别的方法试试 12/30 15:52