【问题标题】:Python scraping email address from href linkPython从href链接中抓取电子邮件地址
【发布时间】:2023-12-24 16:33:01
【问题描述】:

我想获取这些学校的所有电子邮件地址(绿色链接): http://www.schulliste.eu/schule/

现在我有获取所有 href 链接的代码,但是如何点击每个链接并从每个点击的链接中删除电子邮件地址?

from bs4 import BeautifulSoup
from urllib.request import urlopen
import re
import requests

def getLinks(url):
    html_page = urlopen(url)
    soup = BeautifulSoup(html_page)
    links = []

    for link in soup.findAll('a', attrs={'href': re.compile("^http://")}):
        links.append(link.get('href',))

    return links

print(getLinks("http://www.schulliste.eu/schule/"))

【问题讨论】:

    标签: python email href screen-scraping


    【解决方案1】:

    您需要有另一个类似于getLinks 的功能,例如称为 getEmail,您将子页面的 URL 传递给它,它使用 urlopen 和 BeautifulSoup(就像您在第一个函数中所做的那样)获取 HTML 内容并从该页面中提取电子邮件地址。

    然后,您的主代码需要为从 getLinks 检索到的每个链接调用 getEmail

    【讨论】:

      【解决方案2】:

      您可以找到每所学校的所有链接,然后对每个学校运行请求:

      import requests
      from bs4 import BeautifulSoup as soup
      def get_emails(_links:list, _r = [0, 10]):
        for i in range(*_r):
           new_d = soup(requests.get(_links[i]).text, 'html.parser').find_all('a', {'class':'my_modal_open'})
           if new_d:
             yield new_d[-1]['title']
      
      d = soup(requests.get('http://www.schulliste.eu/schule/').text, 'html.parser')
      results = [i['href'] for i in d.find_all('a')][52:-9]
      print(list(get_emails(results)))
      

      输出:

      ['schuleamhasenwald-gue@freenet.de', 'kita-stmartin@htp-tel.de', 'wundertuete@stephansstift.de', 'a.haeupl@igs-baltic-schule.de', 'kindergarten@bothel.de']
      

      【讨论】:

      • 您不认为对电子邮件进行正则表达式模式并在整个页面中搜索会更合理吗?
      • 我不认为所有的电子邮件地址都是必需的 - 根据“Allgemeine Informationen:”框中的摘要数据,只需要那个特定学校的电子邮件地址
      • 是的,我将拥有所有电子邮件地址
      • @Ajax1234 谢谢它很好用,要获得所有电子邮件我必须更改“[0, 10]”还是?是否也可以使用 python 向所有学校发送相同的电子邮件?
      • @clauhau 要获取所有电子邮件,您只需遍历 _links。该范围用于演示目的,因为在我的机器上循环所有内容将花费太长时间。但是请记住,由于列出的学校数量众多,向每个学校发送自动消息很可能构成垃圾邮件。