在写爬取页面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. 以后的IT路还很长(1)

    以后的IT路还很长(1) 最近有两位兄弟同事离职了,蛮可惜了,在一个战壕一起一.两年了,人各有志嘛!希望他们发展更好些! 目前的公司是个创业型的公司,公司从08年的50来个人,扩张到今年11年400多 ...

  2. WEB端缓存机制

    WEB端缓存机制 什么是WEB缓存 Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本.缓存会根据进来的请求保存输出内容的副本:当下一个请 ...

  3. JavaScript 核心学习——继承

    本篇博文讲述如何在 JavaScript 中实现继承,以及原型与原型链的知识,在附录中将会讲述 JavaScript 面向对象的常见错误. ##原型与原型链在 JavaScript 中,使用类将会付出 ...

  4. C++扬帆远航——1

    问题及代码: /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:test.cpp * 作者:常轩 * 完成日期:2 ...

  5. 5——PHP逻辑运算符&&唯一的三元运算符

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  6. H5页面通用头部设置

    见到很多人写H5页面都不设置头部,不忍直视,于是整理一篇文章,不定期更新,为了让自己显得专业一点,也为了方便自己复制粘贴 一般来说必须设置项 <!-- 页面编码 --> <meta ...

  7. 解决vue2.0下IE浏览器白屏问题

    公司新开发的项目需要兼容到IE9+ 就在index.html页面加入 <meta http-equiv="X-UA-Compatible" content="IE= ...

  8. HTML5 Canvas(基础知识)

    最近笔者在学习HTML5的新元素<canvas>,会分享一些基础知识以及小例子,最终使用<canvas>实现一个绘制简单图表(条形图.线图或者饼图)的js库,会更新一到两篇文章 ...

  9. IOS手动添加的View 在代码中使用(自动布局)autoLayout

    - (void)viewDidLoad { [super viewDidLoad]; UIButton *btnTest = [UIButton buttonWithType:UIButtonType ...

  10. 数据结构之HashMap

    前言 在我们开发中,HashMap是我们非常常用的数据结构,接下来我将进一步去了解HashMap的原理.结构. 1.HashMap的实现原理 HashMap底层是基于Hash表(也称“散列”)的数据结 ...