python爬取网站页面时,部分标签无指定属性而报错
在写爬取页面a标签下href属性的时候,有这样一个问题,如果a标签下没有href这个属性则会报错,如下:
百度了有师傅用正则匹配的,方法感觉都不怎么好,查了BeautifulSoup的官方文档,发现一个不错的方法,如下图:
官方文档链接:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
has_attr() 这个方法可以判断某标签是否存在某属性,如果存在则返回 True
解决办法:
为美观使用了匿名函数
- soup_a = soup.find_all(lambda tag:tag.has_attr('href'))
最终实现爬取页面 url 脚本如下:
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Riy
- import time
- import requests
- import sys
- import logging
- from bs4 import BeautifulSoup
- from requests.exceptions import RequestException
- from multiprocessing import Process, Pool
- logging.basicConfig(
- level=logging.DEBUG,
- format='%(levelname)-10s: %(message)s',
- )
- class down_url:
- def download(self, url):
- '''爬取url'''
- try:
- start = time.time()
- logging.debug('starting download url...')
- response = requests.get(url)
- page = response.content
- soup = BeautifulSoup(page, 'lxml')
- soup_a = soup.select('a')
- soup_a = soup.find_all(lambda tag:tag.has_attr('href'))
- soup_a_href_list = []
- # print(soup_a)
- for k in soup_a:
- # print(k)
- soup_a_href = k['href']
- if soup_a_href.find('.'):
- # print(soup_a_href)
- soup_a_href_list.append(soup_a_href)
- print(f'运行了{time.time()-start}秒')
- except RecursionError as e:
- print(e)
- return soup_a_href_list
- def write(soup_a_href_list, txt):
- '''下载到txt文件'''
- logging.debug('starting write txt...')
- with open(txt, 'a', encoding='utf-8') as f:
- for i in soup_a_href_list:
- f.writelines(f'{i}\n')
- print(f'已生成文件{txt}')
- def help_memo(self):
- '''查看帮助'''
- print('''
- -h or --help 查看帮助
- -u or --url 添加url
- -t or --txt 写入txt文件
- ''')
- def welcome(self):
- '''欢迎页面'''
- desc = ('欢迎使用url爬取脚本'.center(30, '*'))
- print(desc)
- def main():
- '''主函数'''
- p = Pool(3)
- p_list = []
- temp = down_url()
- logging.debug('starting run python...')
- try:
- if len(sys.argv) == 1:
- temp.welcome()
- temp.help_memo()
- elif sys.argv[1] in {'-h', '--help'}:
- temp.help_memo()
- elif sys.argv[1] in {'-u ', '--url'} and sys.argv[3] in {'-t', '--txt'}:
- a = temp.download(sys.argv[2])
- temp.write(a, sys.argv[4])
- elif sys.argv[1] in {'-t', '--txt'}:
- print('请先输入url!')
- elif sys.argv[1] in {'-u', '--url'}:
- url_list = sys.argv[2:]
- print(url_list)
- for i in url_list:
- a = p.apply_async(temp.download, args=(i,))
- p_list.append(a)
- for p in p_list:
- print(p.get())
- else:
- temp.help_memo()
- print('输入的参数有误!')
- except Exception as e:
- print(e)
- temp.help_memo()
- if __name__ == '__main__':
- main()
python爬取网站页面时,部分标签无指定属性而报错的更多相关文章
- python爬取网站数据
开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...
- python爬取网站数据保存使用的方法
这篇文章主要介绍了使用Python从网上爬取特定属性数据保存的方法,其中解决了编码问题和如何使用正则匹配数据的方法,详情看下文 编码问题因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这 ...
- Python 爬取网站资源文件
爬虫原理: 以下来自知乎解释 首先你要明白爬虫怎样工作.想象你是一只蜘蛛,现在你被放到了互联“网”上.那么,你需要把所有的网页都看一遍.怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页 ...
- python 爬取html页面
#coding=utf-8 import urllib.request def gethtml(url): page=urllib.request.urlopen(url) html=page.rea ...
- Python爬取中文页面的时候出现的乱码问题(续)
我在上一篇博客中说明了在爬取数据的时候,把数据写入到文件的乱码问题 在这一篇里面我做一个总结: 1.首先应该看一个案例 我把数据写在.py文件中: #coding:utf-8 s = 'hehe测试中 ...
- Python爬取中文页面的时候出现的乱码问题
一.读取返回的页面数据 在浏览器打开的时候查看源代码,如果在头部信息中指定了UTF-8 那么再python代码中读取页面信息的时候,就需要指定读取的编码方式: response.read().deco ...
- Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
- 3.15学习总结(Python爬取网站数据并存入数据库)
在官网上下载了Python和PyCharm,并在网上简单的学习了爬虫的相关知识. 结对开发的第一阶段要求: 网上爬取最新疫情数据,并存入到MySql数据库中 在可视化显示数据详细信息 项目代码: im ...
- 解决:Python爬取https站点时SNIMissingWarning和InsecurePlatformWarning
今天想利用Requests库爬取糗事百科站点,写了一个请求,却报错了: 后来参考kinsomy的博客,在cmd中pip install pyopenssl ndg-httpsclient pyasn1 ...
随机推荐
- 以后的IT路还很长(1)
以后的IT路还很长(1) 最近有两位兄弟同事离职了,蛮可惜了,在一个战壕一起一.两年了,人各有志嘛!希望他们发展更好些! 目前的公司是个创业型的公司,公司从08年的50来个人,扩张到今年11年400多 ...
- WEB端缓存机制
WEB端缓存机制 什么是WEB缓存 Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本.缓存会根据进来的请求保存输出内容的副本:当下一个请 ...
- JavaScript 核心学习——继承
本篇博文讲述如何在 JavaScript 中实现继承,以及原型与原型链的知识,在附录中将会讲述 JavaScript 面向对象的常见错误. ##原型与原型链在 JavaScript 中,使用类将会付出 ...
- C++扬帆远航——1
问题及代码: /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:test.cpp * 作者:常轩 * 完成日期:2 ...
- 5——PHP逻辑运算符&&唯一的三元运算符
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- H5页面通用头部设置
见到很多人写H5页面都不设置头部,不忍直视,于是整理一篇文章,不定期更新,为了让自己显得专业一点,也为了方便自己复制粘贴 一般来说必须设置项 <!-- 页面编码 --> <meta ...
- 解决vue2.0下IE浏览器白屏问题
公司新开发的项目需要兼容到IE9+ 就在index.html页面加入 <meta http-equiv="X-UA-Compatible" content="IE= ...
- HTML5 Canvas(基础知识)
最近笔者在学习HTML5的新元素<canvas>,会分享一些基础知识以及小例子,最终使用<canvas>实现一个绘制简单图表(条形图.线图或者饼图)的js库,会更新一到两篇文章 ...
- IOS手动添加的View 在代码中使用(自动布局)autoLayout
- (void)viewDidLoad { [super viewDidLoad]; UIButton *btnTest = [UIButton buttonWithType:UIButtonType ...
- 数据结构之HashMap
前言 在我们开发中,HashMap是我们非常常用的数据结构,接下来我将进一步去了解HashMap的原理.结构. 1.HashMap的实现原理 HashMap底层是基于Hash表(也称“散列”)的数据结 ...