【问题标题】:Python Regex Webcrawling, Get Double results, need just onePython Regex Webcrawling,获得双倍结果,只需要一个
【发布时间】:2020-04-21 02:13:14
【问题描述】:

我正在开发一个基本的 python 网络爬虫程序,以进入网站并读取电子邮件地址并将其显示为输出。我得到了正确的答案,但它被重复了。你能帮忙修一下吗?

这是程序:

from re import findall
import urllib.request

url = "https://www.uta.edu/academics/schools-colleges/business/admissions-and-advising/cob-advising"

print("Email addresses for advisors:")

response = urllib.request.urlopen(url)

html = response.read()

htmlStr = html.decode()

pdata = findall(r"[A-Za-z0-9._%+-]+"
                     r"@[A-Za-z0-9.-]+"
                     r"\.[A-Za-z]{2,4}", htmlStr)

for item in pdata:
    print(item)

【问题讨论】:

    标签: python regex web-crawler findall


    【解决方案1】:
    for item in list(dict.fromkeys(pdata)):
        print(item)
    

    "dict.fromkeys(pdata)" 将列表的项目导入其键。 (在这种情况下,值为 None)导入时,相同的键值将被忽略。 最后 list(dict.fromkeys(pdata)) 将使重复的项目被删除。

    【讨论】:

      【解决方案2】:

      您获得每个电子邮件地址两次,因为您的网站包含两次每个电子邮件地址。您可以将列表转换为一组以仅获取唯一项目。然后,如果您需要列表中的结果,您可以将其转换回列表:

      pdata = list(set(pdata))
      

      【讨论】:

        【解决方案3】:

        html 文件中有所有电子邮件的两个副本(一个在文本中,另一个在href 属性中)。这是这种情况的一个例子:

        <a href="mailto:micah.washington@uta.edu" class="uta-btn uta-btn-ghost">
        <span>micah.washington@uta.edu</span>
        </a>
        

        标准方法是使用解析器只获取 html 的文本而不是属性/标签。但在这里,最简单的方法是打印所有其他元素:

        for item in pdata[::2]:
            print(item)
        

        这是一种更标准的使用 BeautifulSoup html 解析器的方法,其中div.text 提取 html 文本并删除标签和属性:

        from re import findall
        import urllib.request
        from bs4 import BeautifulSoup as bs
        
        url = "https://www.uta.edu/academics/schools-colleges/business/admissions-and-advising/cob-advising"
        
        print("Email addresses for advisors:")
        
        response = urllib.request.urlopen(url)
        
        div = bs(response, 'html5lib')
        
        pdata = findall(r"[A-Za-z0-9._%+-]+"
                             r"@[A-Za-z0-9.-]+"
                             r"\.[A-Za-z]{2,4}", div.text)
        
        for item in pdata:
            print(item)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-10
          • 1970-01-01
          • 2013-03-30
          • 2012-04-09
          • 1970-01-01
          • 2016-03-18
          • 2014-11-18
          • 2015-04-11
          相关资源
          最近更新 更多