python手记(五):requests写爬虫(二):bs4处理文本数据

人生无趣且不易,一起找点乐子吧。欢迎评论,和文章无关的也可以。

 

 

 

上篇介绍了requests的基本用法,最后我们获得了网页的源代码,并将其存到了文本中:

但是,我们需要的并不是全部的代码,我们需要的是文章的那一部分。其实requests.text返回的是字符串类型,我们完全可以用字符串处理,来获得所需。But,太麻烦了,基于此,BeautifulSoup的出生就是来“解放生产力”的。

如果在命令窗口用pip命令的话,记得安装的是bs4,而不是BeautifulSoup。

我们来简单看下“靓汤”(好多地方这么翻译),是怎样解放双手的。

首先,生成bs对象:

from bs4 import BeautifulSoup

with open('spider.txt') as f:
    html = f.read()
bs = BeautifulSoup(html, 'html.parser')

将读进来的字符串直接让bs吞掉,自己写的时候当然没这么麻烦,requests.text获得后,直接当参数传递给bs就可以了,第二个参数是解析器。对文本的解析方式,有三种:html.parser, lxml., html5lib。

有了对象,接下来就有趣了,就可以解放双手了。(别乱想)

我们要获得源代码的title,    how?

print(bs.title)

That's all? Yeah, that's all.

除此之外,标签还有一些属性:

print(bs.title.name)#获得标签名称
print(bs.title.attrs)#获得标签属性,dict类型
print(bs.title.string)#获得标签之间的文本

结果:

由于我们选的这个标签没有属性,所以attrs为空。我们换一个:

用这个link:

attrs就返回了href和rel属性,有些时候我们需要获得一些标签的链接,就可以使用这种方法。

到这里,就有了个问题,我们发现,这种方法只能返回它遇到的第一个标签,如果我想要获得所有的<a>标签呢。

别急,还有个方法

bs = BeautifulSoup(html, 'html.parser')

bs = bs.find_all('a')
print(bs)

一个屏幕撑不下全部的<a>标签。现在我们来看看我们需要的东西在哪里:

在这,一个class="con news_content"的div标签里。

问题又来了,我们怎么得到它呢,直接.div。不行,他不是第一个,find_all()也不行,我们不需要其他的div内容,只需要这个,那我们有没有方法来限制标签,我们要div标签,其次,他的class是con news_content?

可以:

bs = bs.find('div', {'class':'con news_content' })

find方法,与findall的区别就是只寻找一个,而不是全部,第二个参数用dict给出,来对bs加以限定。

由于东西太多,我们输入到文本中再进行查看:

bs = BeautifulSoup(html, 'html.parser')

bs = bs.find('div', {'class':'con news_content' })

txt = str(bs).replace(u'\xa0', u'')
with open('bs.txt', 'w') as f:
    f.write(txt)

中间有一步replace是文中的一个特殊字符,Unicode编码的时候出了问题,将他删掉了:

差不多了,有点意思了,但还是不好看,里面还有很多标签,怎么处理?我们看到里面的标签近乎毫无规律,而且很密集,这时候我一般就要请正则表达式出场了,把整个文本进行匹配,匹配<.....>这样的字符串,然后用空字符串去替换:

from bs4 import BeautifulSoup
import re

with open('spider.txt') as f:
    html = f.read()

bs = BeautifulSoup(html, 'html.parser')

bs = bs.find('div', {'class':'con news_content' })


txt = str(bs).replace(u'\xa0', u'')
dr = re.compile(r'<[^>]+>',re.S)
dd = dr.sub('',txt)#替换

with open('bs.txt', 'w') as f:
    f.write(dd)

正则表达式还是很强大的,当bs很难解放你的双手的时候,那就勤勤恳恳的动手吧。

来看下效果:

Beautiful!

 

(后记:

 

完成了,大家可以用这种方法,去爬自己想看的小说。不用担心小说没有在一个网页上,其实他们都是有规律的,你查看一本小说,第一话和第二话的url往往就是id=1,id=2的区别。你需要做的就是找到他的规律,有一个for循环,让它一页页的帮你爬下来就可以了,很简单吧。

举个例子(网址我随便编啦):

urlbase = 'http://www.xiaoshuo.com/daomu&id='

for i in range(100):
    url = urlbase + str(i)
    r = requests.get()
    bs = BeautifulSoup(r.text)
    ...
    ...

这样就可以了。至于爬图片,其实都是一样的只是在把图片写入文件的时候要用二进制形式,而不能用文本形式:

https://blog.csdn.net/qq_41500251/article/details/80623877

这里有个简单例子,是用urllib写的,无所谓,只需要去关注图片怎样保存就可以了。

后面的一篇文章,我们实践写一个翻译器,捎带将几个经常用到的功能点介绍下,让大家基本可以爬到自己想要的东西。

再见。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值