bs4爬取的时候有两个标签相同_爬取红楼梦bs4详解

本文介绍了使用BeautifulSoup(bs4)库爬取《红楼梦》网页内容的过程,强调了select方法在层级定位上的便利性。通过实例展示了find、text、string和get_text()的区别,并分享了在爬虫过程中遇到的网站访问限制问题及正则表达式的应用尝试。
摘要由CSDN通过智能技术生成

 ”明月如霜,好风如水,清景无限 

上次用了一下正则,说实话文远没弄明白,但是没关系先用bs4凑合着(文远落泪:刚又用了下正则,发现和我想象的很不一样啊)



                         壹     

这次是一个爬取红楼梦的小栗子,网址:https://www.shicimingju.com/book/hongloumeng.html

bdc92ee75d25a9d1a6c434529c129ea2.png

还是分析一下:

<li><a href="/book/hongloumeng/1.html">第 一 回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀a>li>

先从特征

"book-mulu" >,发现 <a href标签对应的内容是详细网址的url,而 标签对应得内容是每章的标题,在转到详情页面。

004f25675995b519f51a1e4505e83f63.png

相当清楚,

"chapter_content">里面的标签里都是每章对应一段的内容。

                         贰  

上代码:

import requestsfrom bs4 import BeautifulSoupimport lxmlimport reheaders={    'User=Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36' }url='https://www.shicimingju.com/book/hongloumeng.html'

先还是爬前准备:

main_text = requests.get(url=url,headers=headers).textsoup = BeautifulSoup(main_text,'lxml')li_all=soup.select('.book-mulu > ul >li')

这里用到了BeautifulSoup对象实例化,也是本次操作的重点,可以说select方法是bs4对象的一个最重要的方法,主要是因为层级定位,我们知道,数据解析的作用就是匹配到你想要的数据,而select方法这种方便的标签层级定位就相当方便了。(bs4是python独有的)

d0954a2183db20ba5127f15b95cec0d8.png

attr1={'class':'chapter_content'}f=open('红楼梦.txt','w',encoding='utf-8')for li in li_all:    page_title=li.a.string    page_url='https://www.shicimingju.com'+li.a['href']#     print(page_url)        detail_text=requests.get(url=page_url,headers=headers).text    detail_soup=BeautifulSoup(detail_text,'lxml')    content_part=detail_soup.find('div',attr1)#     print(content_part)    # 得到本章所有段落    content=content_part.text    # 持久化存储    f.write(page_title+' : '+content+'\n\n')    print(page_title+': 本章下载完成!!!!!!!!!!!!!!!!')

此时要注意的是,正文界面的soup要再次实例化,detail_soup需要传入正文界面的字符串响应,这里正好涉及到soup对象的另外的方法,find函数。

04ab473514ae395914812c884f177f3b.png

根据这几个例子的结果,文远觉得这三个方法还是比较容易理解的。

                         叁  

比较一下三个,text,string,get_text()的区别:

2e6e7f9e90b185a1ce3a20a68599ad9d.png


在最具体层级的标签下,标题本身也就是li.a的内容,此时三个方法一样,而实际上,string 只能获得本层级的内容,如下例子:

9cd6fca568dffbd3d7fccde8c84e45ed.png

当然正文网址可以自己构建,规律很明显:
new_url='https://www.shicimingju.com/book/hongloumeng/{}.html'for i in range(1,121):    print(new_url.format(i))    Nurl=new_url.format(i)

                         肆  

最后放一下,爬取的内容:

a91ce888d0e460f0932a88418a69a6a0.png

后期应该会尝试一下红楼梦的词云,尽请期待,有意思的是这个网站在爬了两次之后就拒绝访问报错如下:(还是尽量在爬取时加延迟啥的,不妨碍人家网站正常运行比较好)

ConnectionError: HTTPSConnectionPool(host='www.shicimingju.com', port=443): Max retries exceeded with url: /book/hongloumeng.html (Caused by NewConnectionError(': Failed to establish a new connection: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。',))

再加一下文远尝试正则的失败代码:(不知道大佬们有没有啥好建议)

这是部分main_text内容:

 
class="book-mulu"> <ul> <li><a href="/book/hongloumeng/1.html">第 一 回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀a>li> <li><a href="/book/hongloumeng/2.html">第 二 回 贾夫人仙逝扬州城 冷子兴演说荣国府a>li>
####  失败ex_code-snippet__string">"book-mulu">.*?title_list=re.findall(ex_title,main_text,re.S)print("len:",len(title_list))print(title_list)### 输出如下len: 1['/book/hongloumeng/1.html']

                  END  

作者:不爱夜跑的影迷不是好程序猿    

       喜欢的话请关注点赞? ?? ?                     

1922d75477471a1b4ad78ba9e257fd8a.gifcc10828f5b1552f1d33932926b87b43c.png

                        壹句 :    东风破

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值