在写爬取页面a标签下href属性的时候,有这样一个问题,如果a标签下没有href这个属性则会报错,如下:

百度了有师傅用正则匹配的,方法感觉都不怎么好,查了BeautifulSoup的官方文档,发现一个不错的方法,如下图:

官方文档链接:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

has_attr() 这个方法可以判断某标签是否存在某属性,如果存在则返回 True

解决办法:

为美观使用了匿名函数

  1. soup_a = soup.find_all(lambda tag:tag.has_attr('href'))

最终实现爬取页面 url 脚本如下:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:Riy
  4.  
  5. import time
  6. import requests
  7. import sys
  8. import logging
  9. from bs4 import BeautifulSoup
  10. from requests.exceptions import RequestException
  11. from multiprocessing import Process, Pool
  12.  
  13. logging.basicConfig(
  14. level=logging.DEBUG,
  15. format='%(levelname)-10s: %(message)s',
  16. )
  17.  
  18. class down_url:
  19. def download(self, url):
  20. '''爬取url'''
  21. try:
  22. start = time.time()
  23. logging.debug('starting download url...')
  24. response = requests.get(url)
  25. page = response.content
  26. soup = BeautifulSoup(page, 'lxml')
  27. soup_a = soup.select('a')
  28. soup_a = soup.find_all(lambda tag:tag.has_attr('href'))
  29. soup_a_href_list = []
  30. # print(soup_a)
  31. for k in soup_a:
  32. # print(k)
  33. soup_a_href = k['href']
  34. if soup_a_href.find('.'):
  35. # print(soup_a_href)
  36. soup_a_href_list.append(soup_a_href)
  37. print(f'运行了{time.time()-start}秒')
  38. except RecursionError as e:
  39. print(e)
  40. return soup_a_href_list
  41.  
  42. def write(soup_a_href_list, txt):
  43. '''下载到txt文件'''
  44. logging.debug('starting write txt...')
  45. with open(txt, 'a', encoding='utf-8') as f:
  46. for i in soup_a_href_list:
  47. f.writelines(f'{i}\n')
  48. print(f'已生成文件{txt}')
  49.  
  50. def help_memo(self):
  51. '''查看帮助'''
  52. print('''
  53. -h or --help 查看帮助
  54. -u or --url 添加url
  55. -t or --txt 写入txt文件
  56. ''')
  57.  
  58. def welcome(self):
  59. '''欢迎页面'''
  60. desc = ('欢迎使用url爬取脚本'.center(30, '*'))
  61. print(desc)
  62.  
  63. def main():
  64. '''主函数'''
  65. p = Pool(3)
  66. p_list = []
  67. temp = down_url()
  68. logging.debug('starting run python...')
  69. try:
  70. if len(sys.argv) == 1:
  71. temp.welcome()
  72. temp.help_memo()
  73. elif sys.argv[1] in {'-h', '--help'}:
  74. temp.help_memo()
  75. elif sys.argv[1] in {'-u ', '--url'} and sys.argv[3] in {'-t', '--txt'}:
  76. a = temp.download(sys.argv[2])
  77. temp.write(a, sys.argv[4])
  78. elif sys.argv[1] in {'-t', '--txt'}:
  79. print('请先输入url!')
  80. elif sys.argv[1] in {'-u', '--url'}:
  81. url_list = sys.argv[2:]
  82. print(url_list)
  83. for i in url_list:
  84. a = p.apply_async(temp.download, args=(i,))
  85. p_list.append(a)
  86. for p in p_list:
  87. print(p.get())
  88. else:
  89. temp.help_memo()
  90.  
  91. print('输入的参数有误!')
  92. except Exception as e:
  93. print(e)
  94. temp.help_memo()
  95.  
  96. if __name__ == '__main__':
  97. main()

python爬取网站页面时,部分标签无指定属性而报错的更多相关文章

  1. python爬取网站数据

    开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...

  2. python爬取网站数据保存使用的方法

    这篇文章主要介绍了使用Python从网上爬取特定属性数据保存的方法,其中解决了编码问题和如何使用正则匹配数据的方法,详情看下文     编码问题因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这 ...

  3. Python 爬取网站资源文件

    爬虫原理: 以下来自知乎解释 首先你要明白爬虫怎样工作.想象你是一只蜘蛛,现在你被放到了互联“网”上.那么,你需要把所有的网页都看一遍.怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页 ...

  4. python 爬取html页面

    #coding=utf-8 import urllib.request def gethtml(url): page=urllib.request.urlopen(url) html=page.rea ...

  5. Python爬取中文页面的时候出现的乱码问题(续)

    我在上一篇博客中说明了在爬取数据的时候,把数据写入到文件的乱码问题 在这一篇里面我做一个总结: 1.首先应该看一个案例 我把数据写在.py文件中: #coding:utf-8 s = 'hehe测试中 ...

  6. Python爬取中文页面的时候出现的乱码问题

    一.读取返回的页面数据 在浏览器打开的时候查看源代码,如果在头部信息中指定了UTF-8 那么再python代码中读取页面信息的时候,就需要指定读取的编码方式: response.read().deco ...

  7. Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢

  8. 3.15学习总结(Python爬取网站数据并存入数据库)

    在官网上下载了Python和PyCharm,并在网上简单的学习了爬虫的相关知识. 结对开发的第一阶段要求: 网上爬取最新疫情数据,并存入到MySql数据库中 在可视化显示数据详细信息 项目代码: im ...

  9. 解决:Python爬取https站点时SNIMissingWarning和InsecurePlatformWarning

    今天想利用Requests库爬取糗事百科站点,写了一个请求,却报错了: 后来参考kinsomy的博客,在cmd中pip install pyopenssl ndg-httpsclient pyasn1 ...

随机推荐

  1. 移动 H5 首屏秒开优化方案探讨

    转载bang大神文章,原文<移动 H5 首屏秒开优化方案探讨>,此文仅仅用做自学与分享! 随着移动设备性能不断增强,web 页面的性能体验逐渐变得可以接受,又因为 web 开发模式的诸多好 ...

  2. Google是如何做测试的?

    Google是如何做测试的?(一.二) 导读:本文译自 James Whittaker 在 Google 测试官方博客发表的文章<How Google TestsSoftware >. 在 ...

  3. Errors running builder JavaScript Validator

    问题: 解决方法: 方法一. 选择对应项目—-右键Properties—-Builders—-取消“JavaScript Validator”的勾就OK了 方法二. 找到“.project”文件,找到 ...

  4. js数据类型大全

    声明变量的命名规范(标识符) 1.不能以数字开头,只能以字母或者¥或者_开头 2.js变量名称区分大小写 3.变量名不能含有关键字(this.if.for.while) 4.驼峰命名法 console ...

  5. .ArrayList是如何实现的,ArrayList和LinkedList的区别?ArrayList如何实现扩容?

    ArrayList比较简单,主要是通过数组来实现的 需要注意的是其初始容量是10 /** * Default initial capacity. */ private static final int ...

  6. .NET平台编程语言的衰败

    .NET平台编程语言的衰败 JVM上的编程语言除了Java,其它还有很多,比如最近谷歌公司力捧JVM平台上的语言Kotlin.大数据用的Scala.构建系统用的Groovy..NET平台上的编程语言曾 ...

  7. 前端如何真正晋级成全栈:腾讯 Serverless 前端落地与实践

    Serverless 是当下炙手可热的技术,被认为是云计算发展的未来方向,拥有免运维.降低开发成本.按需自动扩展等诸多优点.尤其是在前端研发领域,使用 Node 开发云函数,可以让前端工程师更加专注于 ...

  8. k8s环境部署.net core web项目(docker本地仓库)

    在之前的文档中,我们部署了.net core web在k8s环境下,达成了集群管理项目的目的.但是,由于是本地部署,需要在所有的node节点都拉取好镜像,这是非常麻烦的,为了只维护一份代码,同步更新. ...

  9. 我厌倦了 Redux,那就造个轮子 Rectx:第三集

    仓库:215566435/rectx 前言 麻烦快去我的仓库里面喷: 老子学不动了,求不要更新. 呵呵,你没想到吧,这玩意儿竟然有第三集!我靠,我自己都没想到,让我们悄悄的回顾一下前两集完全没想到,竟 ...

  10. 精简TTF字体、FontPruner、汉字字体瘦身(非字蛛)

    20190726更新 标黄部分 网上比应用比较多的 字蛛 http://font-spider.org/ 本文使用了本机安装软件,得到瘦身后的 TTF 字体文件 准备工具: python : 我使用是 ...