鱼C论坛

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

[已解决]看下这个正则表达式

[复制链接]
发表于 2018-5-16 11:46:47 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 小木船 于 2018-5-16 12:40 编辑

python3.6.3  运行在jupyter notebook,不能得到结果,也没有错误提示;
目标是要爬豆瓣book首页的新书速递的部分信息

  1. import re
  2. import requests
  3. url = 'https://book.douban.com/'
  4. headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
  5. content = requests.get(url, headers = headers).text
  6. pattern = re.compile(r'<li.*?cover.*?href="(.*?)".*?title="(.*?)".*?more-meta.*?"author">(.*?)</span>.*?"year">(.*?)</span>.*?"publisher">(.*?)</span>.*?</li>', re.S)
  7. results = re.findall(pattern, content)
  8. print(results)
复制代码
最佳答案
2018-5-16 11:46:48
本帖最后由 久疤K 于 2018-5-16 16:26 编辑

可能你的表达式效率不高,编写太复杂了,因为我运行它并没有死掉,而是一直在运行,但就是没有结果。
我这里是一层一层地解析,能够比较快速地得到答案:
  1. import re
  2. import requests
  3. url = 'https://book.douban.com/'
  4. headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}

  5. content = requests.get(url, headers = headers).text

  6. #pattern = re.compile(r'<li.*?cover.*?href="(.*?)".*?title="(.*?)".*?more-meta.*?"author">(.*?)</span>.*?"year">(.*?)</span>.*?"publisher">(.*?)</span>.*?</li>', re.S)

  7. p_ul = re.compile(r'<ul class="list-col list-col5 list-express slide-item">(.*?)</ul>', re.S)
  8. p_li = re.compile(r'<li.*?>(.*?)</li>',re.S)
  9. p_info = re.compile(r'href="(.*?)".*?title="(.*?)".*?more-meta.*?"author">(.*?)</span>.*?"year">(.*?)</span>.*?"publisher">(.*?)</span>',re.S)

  10. infos = []
  11. uls = re.findall(p_ul, content)
  12. for ul in uls:
  13.     lis = re.findall( p_li, ul)
  14.     for li in lis:
  15.         info = re.findall( p_info, li)[0]
  16.         info = [ x.strip() for x in info ]
  17.         infos.append(info)

  18. print( len(infos) )
复制代码

最佳答案

查看完整内容

可能你的表达式效率不高,编写太复杂了,因为我运行它并没有死掉,而是一直在运行,但就是没有结果。 我这里是一层一层地解析,能够比较快速地得到答案:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-16 11:46:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 久疤K 于 2018-5-16 16:26 编辑

可能你的表达式效率不高,编写太复杂了,因为我运行它并没有死掉,而是一直在运行,但就是没有结果。
我这里是一层一层地解析,能够比较快速地得到答案:
  1. import re
  2. import requests
  3. url = 'https://book.douban.com/'
  4. headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}

  5. content = requests.get(url, headers = headers).text

  6. #pattern = re.compile(r'<li.*?cover.*?href="(.*?)".*?title="(.*?)".*?more-meta.*?"author">(.*?)</span>.*?"year">(.*?)</span>.*?"publisher">(.*?)</span>.*?</li>', re.S)

  7. p_ul = re.compile(r'<ul class="list-col list-col5 list-express slide-item">(.*?)</ul>', re.S)
  8. p_li = re.compile(r'<li.*?>(.*?)</li>',re.S)
  9. p_info = re.compile(r'href="(.*?)".*?title="(.*?)".*?more-meta.*?"author">(.*?)</span>.*?"year">(.*?)</span>.*?"publisher">(.*?)</span>',re.S)

  10. infos = []
  11. uls = re.findall(p_ul, content)
  12. for ul in uls:
  13.     lis = re.findall( p_li, ul)
  14.     for li in lis:
  15.         info = re.findall( p_info, li)[0]
  16.         info = [ x.strip() for x in info ]
  17.         infos.append(info)

  18. print( len(infos) )
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-16 17:21:20 | 显示全部楼层
谢谢你的回复!用你的方法可以出结果,我想只得到新书速递的10本书信息,能调整一下正则表达式吗?你的结果现在出来的好像是整个页面的书籍信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-16 18:12:50 | 显示全部楼层
本帖最后由 久疤K 于 2018-5-16 18:29 编辑
小木船 发表于 2018-5-16 17:21
谢谢你的回复!用你的方法可以出结果,我想只得到新书速递的10本书信息,能调整一下正则表达式吗?你的结果 ...


额,本来就是40本啊,一共4页,每页10本。。
a.png

如果你要只获取前10本的话,那
最后加上
  1. infos = infos[0:10]
复制代码
即可,但是每次得到的结果可能不一致,因为你刷新原网页,展示也是不一致的。
总的来说,这40本书不会变,只是顺序变了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-16 18:26:36 | 显示全部楼层
是的,你说的对。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 09:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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