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 ...
随机推荐
- 移动 H5 首屏秒开优化方案探讨
转载bang大神文章,原文<移动 H5 首屏秒开优化方案探讨>,此文仅仅用做自学与分享! 随着移动设备性能不断增强,web 页面的性能体验逐渐变得可以接受,又因为 web 开发模式的诸多好 ...
- Google是如何做测试的?
Google是如何做测试的?(一.二) 导读:本文译自 James Whittaker 在 Google 测试官方博客发表的文章<How Google TestsSoftware >. 在 ...
- Errors running builder JavaScript Validator
问题: 解决方法: 方法一. 选择对应项目—-右键Properties—-Builders—-取消“JavaScript Validator”的勾就OK了 方法二. 找到“.project”文件,找到 ...
- js数据类型大全
声明变量的命名规范(标识符) 1.不能以数字开头,只能以字母或者¥或者_开头 2.js变量名称区分大小写 3.变量名不能含有关键字(this.if.for.while) 4.驼峰命名法 console ...
- .ArrayList是如何实现的,ArrayList和LinkedList的区别?ArrayList如何实现扩容?
ArrayList比较简单,主要是通过数组来实现的 需要注意的是其初始容量是10 /** * Default initial capacity. */ private static final int ...
- .NET平台编程语言的衰败
.NET平台编程语言的衰败 JVM上的编程语言除了Java,其它还有很多,比如最近谷歌公司力捧JVM平台上的语言Kotlin.大数据用的Scala.构建系统用的Groovy..NET平台上的编程语言曾 ...
- 前端如何真正晋级成全栈:腾讯 Serverless 前端落地与实践
Serverless 是当下炙手可热的技术,被认为是云计算发展的未来方向,拥有免运维.降低开发成本.按需自动扩展等诸多优点.尤其是在前端研发领域,使用 Node 开发云函数,可以让前端工程师更加专注于 ...
- k8s环境部署.net core web项目(docker本地仓库)
在之前的文档中,我们部署了.net core web在k8s环境下,达成了集群管理项目的目的.但是,由于是本地部署,需要在所有的node节点都拉取好镜像,这是非常麻烦的,为了只维护一份代码,同步更新. ...
- 我厌倦了 Redux,那就造个轮子 Rectx:第三集
仓库:215566435/rectx 前言 麻烦快去我的仓库里面喷: 老子学不动了,求不要更新. 呵呵,你没想到吧,这玩意儿竟然有第三集!我靠,我自己都没想到,让我们悄悄的回顾一下前两集完全没想到,竟 ...
- 精简TTF字体、FontPruner、汉字字体瘦身(非字蛛)
20190726更新 标黄部分 网上比应用比较多的 字蛛 http://font-spider.org/ 本文使用了本机安装软件,得到瘦身后的 TTF 字体文件 准备工具: python : 我使用是 ...