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 ...
随机推荐
- js中判断为false的情况
document.write((new Boolean())+"<br />"); document.write((new Boolean(" ...
- Git学习小结 ~ Lethe's Blog
学习自https://www.liaoxuefeng.com/wiki/896043488029600 一.创建版本库 (1) git init 初始化一个Git仓库 (2)添加文件到Git仓库,分两 ...
- 11. 无数人难办事? - 迪米特法则(LoD)
11.1 第一天上班 时间: 4月2日19点 地点: 小菜大鸟住所的客厅 任务: 小菜, 大鸟 "回来啦! 怎么样? 第一天上班感受多吧." 大鸟关关心的问道. ...
- X因素 开启它就能让你成为超级明星
开启它就能让你成为超级明星" title="X因素 开启它就能让你成为超级明星"> "只要努力就能成为明星!"记得电影学院的不少老师都这样告诫学 ...
- 在 macOS 上试用 Gentoo/Prefix
前几天参加了许朋程主讲的Tunight,对Gentoo有了一定的了解,不过看到如此复杂的安装过程和长久的编译时间,又看看我的CPU,只能望而却步了.不过,有Gentoo/Prefix这个工具,使得我们 ...
- Atom配置(VIM党) · iuunhao
为什么说是Vim党呢?首先我是一个深度的Vim用户,自己的电脑上基本上可以兼容Vim的插件都有,所有浏览器,所有编辑器都是Vim的操作方式,当然包括我现在书写的markdown的软件EME也是兼容的V ...
- zookeeper 实战 - Pymjer 的博客
下载 $ wget http://apache.forsale.plus/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz 配置conf/zoo.cfg ...
- 一条SQL在内存结构与后台进程工作机制
oracle服务器由数据库以及实例组成,数据库由数据文件,控制文件等物理文件组成,实例是由内存结构+后台进程组成,实例又可以看做连接数据库的方式,在我看来就好比一家公司,实例就是一个决策的办公室,大大 ...
- C++走向远洋——62(项目二1、类模板)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 完整版EXCEL导出 (大框架SpringCloud 业务还是Springboot一套)
这里用的是easypoi 首先引入jar包 <!-- excel --><dependency> <groupId>cn.afterturn</groupId ...