在写爬取页面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爬取网站页面时,部分标签无指定属性而报错的更多相关文章

  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. Leetcode 946. Validate Stack Sequences 验证栈序列

    946. Validate Stack Sequences 题目描述 Given two sequences pushed and popped with distinct values, retur ...

  2. 携程酒店DevOps测试实践

    作者简介 王幸福,携程酒店研发部高级测试经理,负责无线自动化测试相关工作.在测试框架和平台研发.移动测试.DevOps等领域有着丰富的经验. 如今很多大型互联网公司.创新型企业都在积极地进行DevOp ...

  3. WTF is The BlockChain?

    最近区块链大热,走到哪儿都有人在讨论区块链和比特币,甚至于一些对密码学完全没有概念的人都开始大肆吹捧,不免让人嗤之以鼻.相信很多技术和非技术的朋友都希望能够更深层次地去了解它是如何工作的.本文将用不到 ...

  4. 【转载】ArcGIS中的WKID

    原出处:http://www.cnblogs.com/liweis/p/5951032.html 提到坐标系统,大家多少能明白一些,但在运用时,有些朋友搞得不是非常清楚,以后专门来总结.在实地生产项目 ...

  5. Rails工程实战记录

    项目git:https://github.com/yixiaoyang/ruby 为熟悉Rails的基本特性创建的工程,本博文仅作更新记录. (1)2013.10.1-2013.10.5 Ruby基本 ...

  6. ElasticSearch系列四 CURD

    1: ES 类似JPA操作 1.1 编写实体类 1.2 编写映射文件 xxx.json 1.3编写repository继承 ElasticSearchrepository 1.4 编写admin 的C ...

  7. CSS——NO.10(设置技巧)

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

  8. 逐行分析jQuery2.0.3源码-完整笔记

    概览 (function (){ (21 , 94) 定义了一些变量和函数 jQuery=function(); (96 , 293) 给jQuery对象添加一些方法和属性; (285 , 347) ...

  9. ES6的编程风格

    1,建议使用let替代var 2,全局常量使用const,多使用const有利于提高程序的运行效率. const有两个好处:一是阅读代码的人立刻会意识到不应该修改这个值,二是防止无意间修改变量值导致错 ...

  10. 从0系统学Android--5.2 发送广播

    从0系统学Android--52 发送广播 本系列文章目录:更多精品文章分类 本系列持续更新中.... 初级阶段内容参考<第一行代码> 5.3 发送自定义广播 前面已经学习了如何接受广播了 ...