设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
12
返回列表 发新帖
楼主: vocaliu
打印 上一主题 下一主题

新人求教,两个正则匹配问题,爬网页不会找内容。。

[复制链接]

0

主题

0

好友

18

积分

新手上路

Rank: 1

8#
发表于 2017-8-20 11:48:57 |只看该作者
本帖最后由 feifeiwuda 于 2017-8-20 11:50 编辑

请教楼主,我按你的代码在pycharm中运行了一遍,怎么什么都没有啊??也没有在f盘下有新建的pic文件夹。。。求解答
以下是运行结果:

Parent process 36988.
All subprocesses done.

Process finished with exit code 0
回复

使用道具 举报

1

主题

0

好友

45

积分

新手上路

Rank: 1

7#
发表于 2017-8-17 16:06:25 |只看该作者
本帖最后由 vocaliu 于 2017-8-17 16:34 编辑

续前面的内容,关于抓网页的文字内容,整理成数据库。用
  1. r'[\u4e00-\u9fa5]+\S+[\u4e00-\u9fa5]+'
复制代码
的方式匹配得到list1,
然后用list2.append(list1[10])的方式把有用的数据重新填到新的list里,
用到了n.append(' '.join(m_t1[4][77:-7].split()))的形式来抓具体的内容,
再整理成一个二位列表 list3.append(list2)
实现了批量抓数据的工作。
之后通过优化正则方案,得到了更精确的结果。
由于还没有学数据处理相关的操作,学了一下xlwt的方式把上述二维list导入excel保存成xls文件。抓了上千个页面,导出成为一个1000*30的excel。
爬网页数据并整理的工作初步完成。。
回复

使用道具 举报

1

主题

0

好友

45

积分

新手上路

Rank: 1

6#
发表于 2017-8-16 11:52:04 来自手机 |只看该作者
本帖最后由 vocaliu 于 2017-8-19 17:35 编辑
crossin先生 发表于 2017-8-16 09:20
你学得挺快

带着目的学就会快嘛,虽然是套话但是的确有道理。是真想要学会一种语言解决工作中遇到的各种情况。
跟编程的交集是大学要学C,没有感受到用处,混成补考。这些年是越来越觉得有点编程能力不管干啥都好一点,除非牛到干啥都可以掏钱找人实现。
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2017-8-16 09:20:24 |只看该作者
你学得挺快
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

45

积分

新手上路

Rank: 1

地板
发表于 2017-8-16 00:36:30 |只看该作者
本帖最后由 vocaliu 于 2017-8-16 10:45 编辑

果然很简单。。。
  1. regx = r'http://[\S]*/[0-9]{2}\.jpg'
复制代码
顺带又加上了建立文件夹前的if not os.path.exists和下载图片后time.sleep(0.5),代码结构已经基本完整。
可以改进的细节:
之前为了方便做文件大小判定,用的read()之后write()进文件的方式,现在不需要判定文件大小了,可以直接用 urllib.request.urlretrieve();
文件命名纯数字,可以获取每个网页的<title>然后保存成文件夹名;
总之这个图片站抓取完成,选这个网站的原因是一个页面直接几张图,后续需要尝试其他图片站,点击当前图片进入下一页浏览的模式。
看起来好像要学beautysoup

另一边,中文抓数据的那个由于网页非常简单,感觉似乎可以用 \w{2,} 的方式直接取中文,试试去。搞错了\w是包括抓中文不是只抓中文,网上找到这个成功了。
  1. r'[\u4e00-\u9fa5]{2,}'
复制代码
要的刚好是一些2个汉字以上的词语,那些被   隔开的中文本来就用不着。抓出来得到一个[],保留其中有用的数据。
抓的数据有问题,有些文本抓取错误,比如地址会带数字和符号等。改用:
  1. r'[\u4e00-\u9fa5]+\S+[\u4e00-\u9fa5]+'
复制代码
这样可以抓连续的以汉字开头以汉字结尾中间没有空格的数据,但是这样遇到只写到数字房间号结束的地址类型还会出问题,尝试把正则改一下:
  1. r'\S+[\u4e00-\u9fa5]+\S+'
复制代码
这样应该是连续的包含汉字的内容,但是不能识别2个字的名字。
回复

使用道具 举报

1

主题

0

好友

45

积分

新手上路

Rank: 1

板凳
发表于 2017-8-15 23:58:34 |只看该作者
crossin先生 发表于 2017-8-15 22:18
没基础能拼成这样,我也是蛮佩服的
课程里有正则相关的课程,你翻一下。
建议把基础课程看下,花不了多少时 ...

其实是快速扫过你的教程一轮再去找爬虫的,不过没耐下心来打基础。我试试。
这会儿仔细把你教程里的5篇re内容过了一下,干脆在这个帖子下面记录一下进展吧。看看过会儿能不能把我要的两种正则贴出来。
先是学习记录
  1. # -*- coding: utf-8 -*-
  2. '''
  3. Created on Tue Aug 15 23:00:39 2017
  4. @author: vocaliu
  5. @version: Anaconda python3.6
  6. 学习crossincode的re部分:
  7. 1, re.findall(pattern,text)输出符合的结果组成list []
  8. 2,\b转义符的使用,代表单词两端
  9. 3,[]代表其中任意匹配均可
  10. 4,str前的r用于消除转义符
  11. 5,
  12. “.”  换行之外的任意字符(0-1个)
  13. “*”  代表前面字符的任意数量重复
  14. “\S” 空白之外的任意字符(0-1个)
  15. “?”  .* 和 .*? 的区别,一长一短
  16. 6,.*? 和 \S*
  17. 7,
  18. \d = [0123456789]= =[0-9] -> [a-zA-Z] : 任意长度数字\d* or [0-9]*
  19. *号任意数量可以取到0,+号从1开始:    非0的任意长度数字\d+ or [0-9]+
  20. 使用{n}从任意数量变为固定数量n:     \d{11} or [0-9]{11} 代表11位数字
  21. 电话号码的匹配: 1\d{10} or 1[0-9]{10}
  22. {n}  {n,}  {n,m}  的区别。  其中 ?={0,1}
  23. 8,
  24. \w - 匹配字母或数字或下划线或汉字(3.x版本可以匹配汉字,但2.x版本不可以)
  25. \s - 匹配任意的空白符
  26. ^ - 匹配字符串的开始
  27. $ - 匹配字符串的结束         注意与\b的异同
  28. \W - 匹配任意不是字母,数字,下划线,汉字的字符
  29. \D - 匹配任意非数字的字符
  30. \B - 匹配不是单词开头或结束的位置
  31. [^abcd]  除abcd以外的任意字符
  32. '''

  33. '''
  34. 例题1
  35. import re
  36. text = "Hi, I am Shirley Hilton. I am his wife."
  37. text2 = "site sea sue sweet see case sse ssee loses"
  38. pattern1 = r"\bs.*?e\b"
  39. pattern2 = r"\bs\S*e\b"  #.*? 和 \S*的区别
  40. m = re.findall(pattern2, text2)
  41. if m:
  42.     print (m)
  43. else:
  44.     print ('not match')
  45. '''

  46. '''
  47. 例题2
  48. '''
  49. import re
  50. text = ['(021)88776543','010-55667890','02584453362','0571 66345673']
  51. pattern = r"\(?[0-9]+[\)\-\s]?[0-9]+"            # ()-等字符都需要转义
  52. pattern2 = r"\(?0\d{2,3}[) -]?\d{7,8}"           # 更准确的匹配:首位0,考虑数字的数量。注意数字的两种写法以及空格的匹配区别
  53. pattern3 = r"\(0\d{2,3}\)\d{7,8}|0\d{2,3}[ -]?\d{7,8}"  #使用|匹配有或者没有()的两种情况
  54. m = []
  55. for i in range(0,4):
  56.     m.append(re.findall(pattern, text[i]))
  57.     if m[i]:
  58.         print (m[i])
  59.     else:
  60.         print ('not match')
  61. print(m)
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2017-8-15 22:18:30 |只看该作者
没基础能拼成这样,我也是蛮佩服的
课程里有正则相关的课程,你翻一下。
建议把基础课程看下,花不了多少时间。你这样一上来就东拼西凑,最后未必省时间
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-6-28 14:47 , Processed in 0.017243 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部