【问题标题】:Python: extracted email address from a webpage returning extra charactersPython:从返回额外字符的网页中提取电子邮件地址
【发布时间】:2019-07-04 11:52:37
【问题描述】:

Here 是包含电子邮件地址的示例 Web 地址。 这是我正在使用的代码:

from bs4 import BeautifulSoup
import requests
import re

url = 'https://viterbi.usc.edu/directory/faculty/Zadeh/Ali-Enayat'
page_response = requests.get(url, timeout=5)
soup = BeautifulSoup(page_response.content, "html.parser")
email = re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+", soup.text)
print(email)

我希望它返回 azadeh@usc.edu 作为电子邮件地址,但它返回 740-4694azadeh@usc.edu。我做错了什么,如何解决这个问题,以便电子邮件提取适用于任何网页?

【问题讨论】:

  • 告诉我们740-4694和azadeh@usc.edu之间应该有边界的逻辑是什么?不知道这一点,我们无法真正帮助您。
  • 如果我查看页面来源,我会看到:
    联系信息
    • (213) 740-4694
    • azadeh@usc.edu
    • 很明显有一些界限。这有帮助吗?
  • 请不要使用正则表达式来解析 HTML,那是邪恶的。请改用 HTML/XML 解析器。

标签: python regex email


【解决方案1】:

当您可以使用bs4 的全部功能时,无需使用re:

from bs4 import BeautifulSoup as soup
import requests
d = soup(requests.get('https://viterbi.usc.edu/directory/faculty/Zadeh/Ali-Enayat').text, 'html.parser')
email = d.find('div', {'class':'contactInformation'}).find_all('ul')[-2].find_all('li')[-1].text

输出:

'azadeh@usc.edu'

编辑:更通用的方法是将正则表达式应用于bs4对象的html内容:

re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+", str(d))

输出:

['azadeh@usc.edu']

【讨论】:

  • 感谢您的回复,但并非每个页面都有一个名为 contactInformation 的类。我想知道是否可以为任何具有电子邮件地址的页面完成。
  • @TJ1 您能否提供一个指向没有contactInformation div 的页面示例的链接?
  • @TJ1 这是一个非常广泛的问题,因为确实很难检测电子邮件地址和其他元素之间的界限。我添加了一个解决方案,将re.findall 应用于bs4 对象的html 内容,而不是文本,但是,这在某些情况下并不太可靠。更好的方法是找到您正在使用的有限大学名称集,然后编写自定义函数以在与该学校关联的页面上查找电子邮件。您可以从 url 中抓取学校名称,并将其添加到字典中,并以相应的方法作为其键。
  • 谢谢,您编辑的回复至少适用于我的情况。
猜你喜欢
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 2013-11-22
  • 1970-01-01
相关资源
最近更新 更多