鱼C论坛

 找回密码
 立即注册
查看: 3278|回复: 8

关于爬虫beautifulsoup的find_all 和正则表达式

[复制链接]
发表于 2019-11-6 15:39:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在爬取这部小说的时候,上面部分是新更新的部分,下面是第一章到最后一章,所以有重复。我想只爬取后面那部分的内容,也就是第一章到最后,可是<dt>和<dd>标签是同一级的,所以想用正则表达式检测出   正文卷</dt>  到   </dl> 之间的内容,但是这样遇到一个问题,在beautifulsoup的find_all函数里面,妖媚写标签要么写内容,这样   正文卷</dt>  里面的正文卷是属于<dt>标签的,所以不知道怎么输入查找。请大神帮助!
<dl>
<dt>《AWM[绝地求生]》最新章节</dt>
<dd><a href="/book_79086/28779099.html">90.番外</a></dd>
<dd><a href="/book_79086/28710900.html">89.番外</a></dd>
<dd><a href="/book_79086/28695944.html">88.番外</a></dd>
<dd><a href="/book_79086/28679039.html">87.番外</a></dd>
<dd><a href="/book_79086/28627408.html">86.第八十六章</a></dd>
<dd><a href="/book_79086/28607059.html">85.第八十五章</a></dd>
<dd><a href="/book_79086/28583826.html">84.第八十四章</a></dd>
<dd><a href="/book_79086/28555819.html">83.第八十三章</a></dd>
<dd><a href="/book_79086/28525556.html">82.第八十二章</a></dd>
<dd><a href="/book_79086/28485672.html">81.第八十一章</a></dd>
<dd><a href="/book_79086/28364804.html">80.第八十章</a></dd>
<dd><a href="/book_79086/28304852.html">79.第七十九章</a></dd>
<dt>《AWM[绝地求生]》正文卷</dt>
<dd><a href="/book_79086/26759236.html">1.第一章</a></dd>
<dd><a href="/book_79086/26759237.html">2.第二章</a></dd>
<dd><a href="/book_79086/26759238.html">3.第三章</a></dd>
<dd><a href="/book_79086/26759239.html">4.第四章</a></dd>
<dd><a href="/book_79086/26759240.html">5.第五章</a></dd>
<dd><a href="/book_79086/26759241.html">6.第六章</a></dd>
....
<dd><a href="/book_79086/28555819.html">83.第八十三章</a></dd>
<dd><a href="/book_79086/28583826.html">84.第八十四章</a></dd>
<dd><a href="/book_79086/28607059.html">85.第八十五章</a></dd>
<dd><a href="/book_79086/28627408.html">86.第八十六章</a></dd>
<dd><a href="/book_79086/28679039.html">87.番外</a></dd>
<dd><a href="/book_79086/28695944.html">88.番外</a></dd>
<dd><a href="/book_79086/28710900.html">89.番外</a></dd>
<dd><a href="/book_79086/28779099.html">90.番外</a></dd>
</dl>
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-6 16:04:39 From FishC Mobile | 显示全部楼层
想提取哪部分数据
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-6 16:24:36 | 显示全部楼层
wp231957 发表于 2019-11-6 16:04
想提取哪部分数据

<dt>《AWM[绝地求生]》正文卷</dt>    到     </dl>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 17:24:10 | 显示全部楼层
  1. from bs4 import BeautifulSoup


  2. html='''
  3. <dl>
  4. <dt>《AWM[绝地求生]》最新章节</dt>
  5. <dd><a href="/book_79086/28779099.html">90.番外</a></dd>
  6. <dd><a href="/book_79086/28710900.html">89.番外</a></dd>
  7. <dd><a href="/book_79086/28695944.html">88.番外</a></dd>
  8. <dd><a href="/book_79086/28679039.html">87.番外</a></dd>
  9. <dd><a href="/book_79086/28627408.html">86.第八十六章</a></dd>
  10. <dd><a href="/book_79086/28607059.html">85.第八十五章</a></dd>
  11. <dd><a href="/book_79086/28583826.html">84.第八十四章</a></dd>
  12. <dd><a href="/book_79086/28555819.html">83.第八十三章</a></dd>
  13. <dd><a href="/book_79086/28525556.html">82.第八十二章</a></dd>
  14. <dd><a href="/book_79086/28485672.html">81.第八十一章</a></dd>
  15. <dd><a href="/book_79086/28364804.html">80.第八十章</a></dd>
  16. <dd><a href="/book_79086/28304852.html">79.第七十九章</a></dd>
  17. <dt>《AWM[绝地求生]》正文卷</dt>
  18. <dd><a href="/book_79086/26759236.html">1.第一章</a></dd>
  19. <dd><a href="/book_79086/26759237.html">2.第二章</a></dd>
  20. <dd><a href="/book_79086/26759238.html">3.第三章</a></dd>
  21. <dd><a href="/book_79086/26759239.html">4.第四章</a></dd>
  22. <dd><a href="/book_79086/26759240.html">5.第五章</a></dd>
  23. <dd><a href="/book_79086/26759241.html">6.第六章</a></dd>
  24. ....
  25. <dd><a href="/book_79086/28555819.html">83.第八十三章</a></dd>
  26. <dd><a href="/book_79086/28583826.html">84.第八十四章</a></dd>
  27. <dd><a href="/book_79086/28607059.html">85.第八十五章</a></dd>
  28. <dd><a href="/book_79086/28627408.html">86.第八十六章</a></dd>
  29. <dd><a href="/book_79086/28679039.html">87.番外</a></dd>
  30. <dd><a href="/book_79086/28695944.html">88.番外</a></dd>
  31. <dd><a href="/book_79086/28710900.html">89.番外</a></dd>
  32. <dd><a href="/book_79086/28779099.html">90.番外</a></dd>
  33. </dl>
  34. '''
  35. soup = BeautifulSoup(html,"lxml")
  36. title = soup.select('dt')
  37. for x in title :print(x.text)   

  38. w = soup.select('dd')
  39. for x in w :print(x.text)   
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 17:25:04 | 显示全部楼层
T-_coin 发表于 2019-11-6 16:24
《AWM[绝地求生]》正文卷    到

把原始网址发出来 ,有时候 bs4不如其他的方案好  有时候比其他方案优秀   看情况来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-6 18:09:12 | 显示全部楼层

这个代码没有解决问题,只不过把<dt>和<dd>标签分开放而已,这样<dd>标签下会有最新更新的章节和正文卷重叠部分
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-6 18:09:45 | 显示全部楼层
wp231957 发表于 2019-11-6 17:25
把原始网址发出来 ,有时候 bs4不如其他的方案好  有时候比其他方案优秀   看情况来

url = 'https://www.biqugex.com/book_79086/'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 21:39:45 | 显示全部楼层
T-_coin 发表于 2019-11-6 18:09
url = 'https://www.biqugex.com/book_79086/'
  1. import requests
  2. from bs4 import BeautifulSoup


  3. html=requests.get("https://www.biqugex.com/book_79086/")
  4. html.encoding=("gbk")
  5. soup = BeautifulSoup(html.text,"lxml")
  6. title = soup.select('body > div.listmain > dl > dt:nth-child(14)')
  7. for x in title :print(x.text)   
  8. for zj in range(15,105):
  9.   w = soup.select('body > div.listmain > dl > dd:nth-child(%d)'%zj)
  10.   print(w[0].text)   
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-7 09:13:34 | 显示全部楼层
本帖最后由 天圆突破 于 2019-11-7 09:19 编辑
  1. import re
  2. from requests_html import HTMLSession

  3. session = HTMLSession()
  4. url = 'https://www.biqugex.com/book_79086/'

  5. req = session.get(url=url)
  6. req = req.html

  7. # 拿到了所有的dt和dd
  8. dl = req.find('.listmain>dl>dt,.listmain>dl>dd')
  9. dl_html = [i.html for i in dl]
  10. # 下面可以循环找要定位的dt,例如设定的条件是"内容里面有正文卷三个字"
  11. dt = list(filter(lambda x: re.search('正文卷', x.text), req.find('.listmain>dl>dt')))

  12. # 拿到上面的dl里,找到索引,然后切片
  13. if dt:
  14.     dt_html = dt[0].html
  15.     # 找索引要用.Html来找
  16.     indx = dl_html.index(dt_html)
  17.     # 为了防止里面还有dt,再筛一遍
  18.     dl = list(filter(lambda x: x.tag=='dd', dl[indx+1:]))
  19.     # 找出里面的a标签
  20.     taga = [d.find('a', first=True) for d in dl]
  21.     # 整理结果,用反射是为了容错,避免因为意外情况受到影响报错
  22.     result = [
  23.         {
  24.             'title': getattr(a, 'text').strip(),
  25.             'href': getattr(a, 'attrs', {}).get('href', '')
  26.         } for a in taga
  27.     ]
  28.     print(result)
复制代码


没有用bs,轻量级的爬虫用request_html就够了
另外,request_html是rquest作者最新出的爬虫库,自带解析,个人觉得bs虽然挺重,但是有时候反而不如这个方便...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-4-7 08:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表