python-73:让我们来解决这个不和谐的符号
2016-01-06 00:00
686 查看
上一小节我们认识了删除三兄弟,但是我们最重要的还是要解决问题,首先,毫无疑问,我们肯定要从这三种方法中选一个来使用,虽然前面已经讲解了这三个函数的使用方法并且对实例进行了分析,但是,这还是远远不够的
前面使用的例子中,我们只是对单个句子进行删除操作,文档树只是一个句子,我们删除的也只是这个句子中的一两个单词而已,而我们这个实例要求我们能够在一大块的网页源码中删除特定的句子,这些句子还不知道有多少行,这两种情况之间相差很大,我们需要想办法从例子中拓展思维然后解决我们的问题
我们把要实现的功能细化分析一下,首先,找出需要删除的句子,然后想办法将这些句子删除并输出
1. 找出需要删除的句子
前面已经说过了,我们需要删除的带有 class="headerlink" 属性的代码,就像下面的代码一样,
我们不知道这样的代码一共有多少行,要想将这些代码全部找出来,我们只能用find_all,前面说了find只能找到匹配的第一个代码,我们可以测试看看find_all返回的结果,我们要获取的是带有某个属性的标签,这跟前面获取正文的代码好像一样,我还是打算使用keyword参数,于是我写下了这样一段代码,
很不幸的是运行的时候报错了
File "test.py", line 20
print result.find_all(class = "headerlink")
^
SyntaxError: invalid syntax
错误原因显示无效的参数,我觉得很纳闷,为什么传给find_all的参数是无效的
这里我们传的是class,而class是HTML的一个关键字,也是python的关键字,程序并不能识别它到底是什么,所以报了一个无效的参数这个错误,幸运的是,find_all中已经针对这种情况做了应对的机制,前面也已经说过了,我们需要使用另一个参数 attrs 传入一个字典,于是,上面的代码应该将最后一句修改成这样
好了,修改后的代码运行的结果跟我们预想的一样,是一个列表,现在我们来考虑下一个问题,怎么将获取到的代码删除
2. 怎么将获取的代码删除
前面的例子只是删除文档树里面的一句话,我们还没遇到删除多句话的情况,不过我自然而然的想到直接用前面的方法来试试看行不行,于是我写下了这样的代码
但是结果却是这样的
AttributeError: 'ResultSet' object has no attribute 'clear'
属性错误,意思是说这个对象没有这个属性呗,这是为什么?
首先,find_all 返回的是一个列表,extract() 是BS4里面的一个方法,要使用BS4的方法,前面也说了,需要将文档转换为BeautifulSoup 对象,但是lines是一个列表,我们上面的代码直接对这个列表调用extract(),这是不对的,我们还需要将lines转换为BeautifulSoup 对象,好吧,再把代码修改一下
结果还是不对
TypeError: expected string or buffer
类型错误!!传入的必须是字符串或者缓冲区数据!!天了噜,还让不让人好好写代码啦
这个错误的原因也很简单,生成BeautifulSoup的数据必须是字符串或缓冲区里面的内容,而list是不能拿来生成BeautifulSoup对象的,所以我们还需要将list转换成string,于是程序被改成了这样子
这次运行终于没有报错了,然而还是没有什么卵用,因为我们想要删除的那个字符还依然健在
holy shit
真真是一口热翔
前面使用的例子中,我们只是对单个句子进行删除操作,文档树只是一个句子,我们删除的也只是这个句子中的一两个单词而已,而我们这个实例要求我们能够在一大块的网页源码中删除特定的句子,这些句子还不知道有多少行,这两种情况之间相差很大,我们需要想办法从例子中拓展思维然后解决我们的问题
我们把要实现的功能细化分析一下,首先,找出需要删除的句子,然后想办法将这些句子删除并输出
1. 找出需要删除的句子
前面已经说过了,我们需要删除的带有 class="headerlink" 属性的代码,就像下面的代码一样,
<h2>注释及特殊字符串<a class="headerlink" href="#id14" title="永久链接至标题">¶</a></h2>
我们不知道这样的代码一共有多少行,要想将这些代码全部找出来,我们只能用find_all,前面说了find只能找到匹配的第一个代码,我们可以测试看看find_all返回的结果,我们要获取的是带有某个属性的标签,这跟前面获取正文的代码好像一样,我还是打算使用keyword参数,于是我写下了这样一段代码,
import urllib2 from bs4 import BeautifulSoup url = 'http://beautifulsoup.readthedocs.org/zh_CN/latest/#' request = urllib2.Request(url) response = urllib2.urlopen(request) contents = response.read() soup = BeautifulSoup(contents) result = soup.find(itemprop="articleBody") print result.find_all(class = "headerlink")
很不幸的是运行的时候报错了
File "test.py", line 20
print result.find_all(class = "headerlink")
^
SyntaxError: invalid syntax
错误原因显示无效的参数,我觉得很纳闷,为什么传给find_all的参数是无效的
这里我们传的是class,而class是HTML的一个关键字,也是python的关键字,程序并不能识别它到底是什么,所以报了一个无效的参数这个错误,幸运的是,find_all中已经针对这种情况做了应对的机制,前面也已经说过了,我们需要使用另一个参数 attrs 传入一个字典,于是,上面的代码应该将最后一句修改成这样
print result.find_all(attrs={"class": "headerlink"})
好了,修改后的代码运行的结果跟我们预想的一样,是一个列表,现在我们来考虑下一个问题,怎么将获取到的代码删除
2. 怎么将获取的代码删除
前面的例子只是删除文档树里面的一句话,我们还没遇到删除多句话的情况,不过我自然而然的想到直接用前面的方法来试试看行不行,于是我写下了这样的代码
import urllib2 from bs4 import BeautifulSoup url = 'http://beautifulsoup.readthedocs.org/zh_CN/latest/#' request = urllib2.Request(url) response = urllib2.urlopen(request) contents = response.read() soup = BeautifulSoup(contents) result = soup.find(itemprop="articleBody") lines = result.find_all(attrs={"class": "headerlink"}) lines.clear() print result.get_text()
但是结果却是这样的
AttributeError: 'ResultSet' object has no attribute 'clear'
属性错误,意思是说这个对象没有这个属性呗,这是为什么?
首先,find_all 返回的是一个列表,extract() 是BS4里面的一个方法,要使用BS4的方法,前面也说了,需要将文档转换为BeautifulSoup 对象,但是lines是一个列表,我们上面的代码直接对这个列表调用extract(),这是不对的,我们还需要将lines转换为BeautifulSoup 对象,好吧,再把代码修改一下
import urllib2 from bs4 import BeautifulSoup url = 'http://beautifulsoup.readthedocs.org/zh_CN/latest/#' request = urllib2.Request(url) response = urllib2.urlopen(request) contents = response.read() soup = BeautifulSoup(contents) result = soup.find(itemprop="articleBody") lines = BeautifulSoup(result.find_all(attrs={"class": "headerlink"})) lines.clear() print result.get_text()
结果还是不对
TypeError: expected string or buffer
类型错误!!传入的必须是字符串或者缓冲区数据!!天了噜,还让不让人好好写代码啦
这个错误的原因也很简单,生成BeautifulSoup的数据必须是字符串或缓冲区里面的内容,而list是不能拿来生成BeautifulSoup对象的,所以我们还需要将list转换成string,于是程序被改成了这样子
import urllib2 from bs4 import BeautifulSoup url = 'http://beautifulsoup.readthedocs.org/zh_CN/latest/#' request = urllib2.Request(url) response = urllib2.urlopen(request) contents = response.read() soup = BeautifulSoup(contents) result = soup.find(itemprop="articleBody") lines = BeautifulSoup(str(result.find_all(attrs={"class": "headerlink"}))) lines.clear() print result.get_text()
这次运行终于没有报错了,然而还是没有什么卵用,因为我们想要删除的那个字符还依然健在
holy shit
真真是一口热翔
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- 爬虫笔记
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- python-74:按原格式下载BS4官方文档