2013-11-11 7 views
0

Я пытаюсь справиться с регулярным выражением в Python. Я пишу очень простой скрипт для очистки писем от заданного URL.Python, форматирование re.findall() output

import re 
from urllib.request import * 


url = input("Please insert the URL you wish to scrape> ") 

page = urlopen(url) 

content = page.read() 

email_string = b'[a-z0-9_. A-Z]*@[a-z0-9_. A-Z]*.[a-zA-Z]' 

emails_in_page = re.findall(email_string, content) 

print("Here are the emails found: ") 

for email in emails_in_page: 
    print(email) 

re.findall() возвращает список, и когда программа печатает электронные письма, «B» из строки регулярного выражения включается в выходном, как это:

b'[email protected]' 
b'[email protected]' 
... 

Как могу ли я распечатать чистый список писем? (т. е. [email protected])

+0

Почему вы отклонять '+' знаки в локальной части? – glglgl

ответ

2

Вы печатаете bytes объектов. Расшифровать их строки:

encoding = page.headers.get_param('charset') 
if encoding is None: 
    encoding = 'utf8' # sensible default 

for email in emails_in_page: 
    print(email.decode(encoding)) 

или декодировать страницу HTML вы извлеченная:

encoding = page.headers.get_param('charset') 
if encoding is None: 
    encoding = 'utf8' # sensible default 

content = page.read().decode(encoding) 

и использовать юникод строку регулярного выражение:

email_string = '[a-z0-9_. A-Z]*@[a-z0-9_. A-Z]*.[a-zA-Z]' 

Многие веб-страница не посылает правильную кодировку параметр в заголовке содержимого, или установить его неправильно, поэтому даже «разумное значение по умолчанию» может быть ошибочным время от времени.

HTML разборе библиотеки, как BeautifulSoup бы сделать лучшую работу кодека обнаружения еще, она включает в себя некоторые дополнительные эвристики, чтобы сделать обоснованное предположение:

from bs4 import BeautifulSoup 

soup = BeautifulSoup(page.read(), from_encoding=page.headers.get_param('charset')) 
for textelem in soup.find_all(text=re.compile(email_string)): 
    print(textelem) 
+0

Спасибо, Martijn, когда я запускаю ваш код (декодирование байтовых объектов, а не HTML), я получаю следующее: Traceback (последний последний вызов): Файл «simple_scraper.py», строка 11, в encoding = page .headers.getparam ('charset') AttributeError: объект HTTPMessage не имеет атрибута 'getparam' – user2331291

+0

@ user2331291: Да, я забыл подчеркивание, так как исправлено. –

Смежные вопросы