0

我正在尝试掌握 Python 中的正则表达式。我正在编写一个非常简单的脚本来从给定的 URL 中删除电子邮件。

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'email1@email.com'
b'email2@email.com'
...

如何打印出一份干净的电子邮件列表?(即email1@email.com:)

4

1 回答 1

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)

并使用 unicode 字符串正则表达式:

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

许多网页没有在内容类型标头中发送正确的字符集参数,或者设置错误,因此即使是“合理的默认值”有时也会出错。

BeautifulSoup这样的 HTML 解析库在编解码器检测方面仍然做得更好,它包含更多启发式方法来进行有根据的猜测:

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)
于 2013-11-11T09:34:00.060 回答