如何改进这段代码(用Python抓取)?

时间:2017-03-24 19:00:04

标签: python-2.7 web-scraping beautifulsoup urllib2 xlwt

我对编程很陌生,所以如果我的问题太琐碎,我就会道歉。 我最近参加了一些Udacity课程,比如"计算机科学简介","使用Python编程基础"和其他一些人。

前几天,我的老板让我从某些网站收集一些电子邮件地址。他们中的一些人在同一页面上有很多地址,所以铃声响了,我想创建自己的代码来完成收集电子邮件并将其粘贴到电子表格中的重复性任务。

因此,在回顾了这些corses的一些课程以及youtube上的一些视频后,我想出了这段代码。

注意:它是用Python 2.7.12编写的,我使用的是Ubuntu 16.04。

import xlwt
from bs4 import BeautifulSoup
import urllib2

def emails_page2excel(url):
    # Create html file from a given url
    sauce = urllib2.urlopen(url).read()
    soup = BeautifulSoup(sauce,'lxml')

    # Create the spreadsheet book and a page in it
    wb = xlwt.Workbook()
    sheet1 = wb.add_sheet('Contacts')

    # Find the emails and write them in the spreadsheet table
    count = 0
    for url in soup.find_all('a'):
    link = url.get('href')
    if link.find('mailto')!=-1:
        start_email = link.find('mailto')+len('mailto:')
        email = link[start_email:]
        sheet1.write(count,0,email)
        count += 1

    wb.save('This is an example.xls')

代码运行良好且速度非常快。但是,我想通过以下方式改进它:

  • 我觉得for循环可以在更优雅的 中完成 办法。除了字符串查找之外,还有其他方法可以查找电子邮件吗?就像我发现' a'标签?
  • 我希望能够使用网站列表(最有可能在电子表格中)评估此代码,而不是仅使用网址字符串对其进行评估。我还没有时间研究如何做到这一点,但任何建议都是受欢迎的。
  • 最后但并非最不重要的是,我想询问是否有任何方法可以在某种友好使用的迷你程序中实现此脚本。我的意思是,例如,我的老板对计算机完全不好:我无法想象她打开一个终端shell并执行python代码。相反,我想创建一些程序,只需粘贴网址,或上传一个电子表格,其中包含她想要提取电子邮件的网站,选择是否要提取电子邮件或任何其他信息,可能还有更多功能然后单击按钮并获得结果。

我希望我能清楚表达自己。 提前谢谢,

安寝

1 个答案:

答案 0 :(得分:0)

BeautifulSoup而言,您可以通过以下三种方式在a中搜索电子邮件:

1)使用find_alllambda一起搜索ahref作为属性的所有代码,其值为mailto。< / p>

for email in soup.find_all(lambda tag: tag.name == "a" and "href" in tag.attrs and "mailto:" in tag.attrs["href"]):
print (email["href"][7:])

2)使用find_allregex一起在mailto:代码中查找a

for email in soup.find_all("a", href=re.compile("mailto:")):
    print (email["href"][7:])

3)使用select查找a标记,其href属性以mailto:开头。

for email in soup.select('a[href^=mailto]'):
    print (email["href"][7:])

这是我个人的偏好,但我更喜欢使用requests而不是urllib。更简单,更好的错误处理和线程安全。

就您的其他问题而言,您可以创建一个方法来获取,解析和返回所需的结果,并将url作为参数传递。您只需要循环您的网址列表并调用该方法。

对于你的老板问题,你应该使用GUI

玩得开心。