鱼C论坛

 找回密码
 立即注册
查看: 744|回复: 4

[已解决]使用re处理爬取内容时,re不能正确处理

[复制链接]
发表于 2020-4-19 15:45:42 | 显示全部楼层 |阅读模式

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

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

x
http://dongman.2345.com/top/网页上爬取动漫排行,但是在用re处理爬取的动漫简介的时候,它漏下了一个简介,求大神们帮忙找原因。
  1. import requests
  2. import re

  3. #获取页面内容
  4. def getHTMLText(url):
  5.     try:
  6.         r = requests.get(url,timeout = 30)
  7.         r.raise_for_status()
  8.         r.encoding = r.apparent_encoding
  9.         return r.text
  10.     except:
  11.         return ""

  12. #处理页面内容
  13. def fillAniList(ulist,html):
  14.     n = re.findall(r'alt\=".*?"',html)
  15.     #就是在下面这部出的问题
  16.     it = re.findall(r'\<p class\="pTxt pIntroShow"\>.*?\<',html)
  17.     for i in range(len(n)):
  18.         name = n[i].split('=')[1]
  19.         intro = it[i].split('>')[1]
  20.         intro = intro.split('<')[0]
  21.         ulist.append(name)
  22.         ulist.append(intro)

  23. #输出页面内容
  24. def printAniList(ulist):
  25.     for i in range(len(ulist)/2):
  26.         print(i+1)
  27.         print(ulist[2*i])
  28.         print(ulist[2*i+1])

  29. #主函数
  30. def main():
  31.     url = "http://dongman.2345.com/top/"
  32.     uinfo = []
  33.     html = getHTMLText(url)
  34.     fillAniList(uinfo,html)
  35.     printAniList(uinfo)

  36. main()
复制代码


经过筛查,我发现排名第23名的简介不见了。
最佳答案
2020-4-19 16:49:58
本帖最后由 suchocolate 于 2020-4-19 16:52 编辑

以下是我的方法,仅供参考。
  1. import requests
  2. import re

  3. url = 'http://dongman.2345.com/top/'
  4. headers = {'user-agent': 'firefox'}
  5. r = requests.get(url, headers=headers)
  6. r.encoding = 'gbk'
  7. cart_name = re.findall(r'_blank">(.*?)<', r.text)[0:50]
  8. cart_info = re.findall(r'pIntroShow">(.*?)<', r.text, re.S)
  9. print(cart_name)
  10. print(cart_info)
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-19 16:49:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 suchocolate 于 2020-4-19 16:52 编辑

以下是我的方法,仅供参考。
  1. import requests
  2. import re

  3. url = 'http://dongman.2345.com/top/'
  4. headers = {'user-agent': 'firefox'}
  5. r = requests.get(url, headers=headers)
  6. r.encoding = 'gbk'
  7. cart_name = re.findall(r'_blank">(.*?)<', r.text)[0:50]
  8. cart_info = re.findall(r'pIntroShow">(.*?)<', r.text, re.S)
  9. print(cart_name)
  10. print(cart_info)
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-19 17:24:21 | 显示全部楼层
suchocolate 发表于 2020-4-19 16:49
以下是我的方法,仅供参考。

感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-19 17:28:40 | 显示全部楼层
suchocolate 发表于 2020-4-19 16:49
以下是我的方法,仅供参考。

我想问一下,我的那个代码问题出在哪
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 18:48:55 | 显示全部楼层
低调的恶棍 发表于 2020-4-19 17:28
我想问一下,我的那个代码问题出在哪

1)你的那行语法没有加re.S,这样如果简介文本里有换行就匹配不到了。
2)另外匹配到了不想要的三角括号,你可以用()来捕获组,这样组外的就不会输出了。
  1. <font color="RoyalBlue"># 以 【_blank">】开头,以【<】结尾,中间的任意内容【.*?】,外头加了括号【()】,这样只返回符合括号内的,头尾就不显示了。</font>
  2. cart_name = re.findall(r'_blank">(.*?)<', r.text)[0:50]
  3. <font color="RoyalBlue"># 加了【re.S】,让【.】能够匹配换行,这样就可以匹配到多行的文本。</font>
  4. cart_info = re.findall(r'pIntroShow">(.*?)<', r.text, re.S)
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 17:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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