您的位置:首页 > 编程语言 > Python开发

python-73:让我们来解决这个不和谐的符号

2016-01-06 00:00 686 查看
上一小节我们认识了删除三兄弟,但是我们最重要的还是要解决问题,首先,毫无疑问,我们肯定要从这三种方法中选一个来使用,虽然前面已经讲解了这三个函数的使用方法并且对实例进行了分析,但是,这还是远远不够的

前面使用的例子中,我们只是对单个句子进行删除操作,文档树只是一个句子,我们删除的也只是这个句子中的一两个单词而已,而我们这个实例要求我们能够在一大块的网页源码中删除特定的句子,这些句子还不知道有多少行,这两种情况之间相差很大,我们需要想办法从例子中拓展思维然后解决我们的问题

我们把要实现的功能细化分析一下,首先,找出需要删除的句子,然后想办法将这些句子删除并输出

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 爬虫