2014-05-09 3 views
1

Я пытаюсь загрузить несколько сотен корейских страниц, как это:Regex на юникод строку

http://homeplusexpress.com/store/store_view.asp?cd_express=3

Для каждой страницы, я хочу использовать регулярное выражение для извлечения поле «адрес», который в выше страница выглядит следующим образом:

* 주소: 서울시 광진구 구의 1 동 236-53

Так что я это сделать:

>>> import requests 
>>> resp=requests.get('http://homeplusexpress.com/store/store_view.asp?cd_express=3') 
>>> resp.encoding 
'ISO-8859-1' 
>>> # I wonder why it's ISO-8859-1, since I thought that is for Latin text (Latin-1). 
>>> html = resp.text 
>>> type(html) 
<type 'unicode'> 
>>> html 
(outputs a long string that contains a lot of characters like \xc3\xb7\xaf\xbd\xba \xc0\xcd\xbd\xba\xc7\xc1\xb7\xb9\) 

Затем я написал сценарий. Я поставил # -*- coding: utf-8 -*- на .py файл и поместить это:

address = re.search('주소', html) 

Однако re.search возвращается None. Я пробовал с и без префикса u в строке регулярного выражения.

Обычно я могу решить такие вопросы, позвонив по телефону .encode или .decode, но я попробовал несколько вещей и застрял. Любые указатели на то, что мне не хватает?

+0

Что вы получите, если вы введите '주소' в оболочку, как вы делали с 'html'? Я получаю «\ xec \ xa3 \ xbc \ xec \ x86 \ x8c», который 're' может использовать без проблем. –

+0

@RobWatts: IDLE дает мне: «Неподдерживаемые символы на входе». PowerShell отображает их как поля, а Python оценивает их на «??» – RexE

+2

На странице используется кодировка euc-kr, которая отличается от utf-8. –

ответ

2

По тегу в заголовке HTML документа:

<meta http-equiv="Content-Type" content="text/html; charset=euc-kr"> 

веб-страница использует кодировку EUC-KR.

Я написал этот код:

# -*- coding: euc-kr -*- 

import re 

import requests 

resp=requests.get('http://homeplusexpress.com/store/store_view.asp?cd_express=3') 
html = resp.text 

address = re.search('주소', html) 

print address 

Тогда я сохранил его в Gedit, используя кодировку EUC-KR.

У меня есть матч.

Но на самом деле существует еще лучшее решение! Вы можете сохранить кодировку utf-8 для своих файлов.

# -*- coding: utf-8 -*- 

import re 

import requests 

resp=requests.get('http://homeplusexpress.com/store/store_view.asp?cd_express=3') 

resp.encoding = 'euc-kr' 
# we need to specify what the encoding is because the 
# requests library couldn't detect it correctly 

html = resp.text 
# now the html variable contains a utf-8 encoded unicode instance 

print type(html) 

# we use the re.search functions with unicode strings 
address = re.search(u'주소', html) 

print address 
+0

Отлично, это сработало, спасибо! – RexE

0

Из запросов documetation: Когда вы делаете запрос, запросы делают обоснованные предположения о кодировании ответа на основе HTTP заголовков

Если вы проверить свой сайт, мы можем видеть, что нет кодирования ответ сервера: enter image description here

Я думаю, что единственный вариант в этом случае непосредственно указать, какую кодировку использовать:

# -*- coding: utf-8 -*- 

import requests 
import re 

r = requests.get('http://homeplusexpress.com/store/store_view.asp?cd_express=3') 
r.encoding = 'euc-kr' 
print re.search(ur'주소', r.text, re.UNICODE) 
Смежные вопросы