鱼C论坛

 找回密码
 立即注册
查看: 1110|回复: 6

第55讲 课后习题,爬虫问题

[复制链接]
发表于 2018-5-21 13:41:30 | 显示全部楼层 |阅读模式

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

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

x
  1. import urllib.request
  2. import re
  3. from bs4 import BeautifulSoup

  4. def main():
  5.     url = "http://baike.baidu.com/view/284853.htm"
  6.     response = urllib.request.urlopen(url)
  7.     html = response.read()
  8.     soup = BeautifulSoup(html, "html.parser") # 使用 Python 默认的解析器
  9.    
  10.     for each in soup.find_all(href=re.compile("view")):
  11.         print(each.text, "->", ''.join(["http://baike.baidu.com", each["href"]]))
  12.         # 上边用 join() 不用 + 直接拼接,是因为 join() 被证明执行效率要高很多

  13. if __name__ == "__main__":
  14.     main()
复制代码


其中
  1. for each in soup.find_all(href=re.compile("view")):
复制代码

这里href = re.compile('view'),有点看不明白,和普通的正则表达式不同,有小伙伴说说怎么用的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-21 14:43:33 | 显示全部楼层
就是将正则表达式编译一下,这样速度更快而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-21 15:48:21 | 显示全部楼层
BngThea 发表于 2018-5-21 14:43
就是将正则表达式编译一下,这样速度更快而已

如果把href=re.compile("view")换成href = 'view'则程序得不到结果呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-21 16:01:15 | 显示全部楼层

回帖奖励 +1 鱼币

使用re的一般步骤是先使用re.compile()函数,将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例)
看一下这段话
href="view"是一个字符串对像
re.compile("view")以后是珍上pattern实例.
是否是这种类别不一致
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-21 16:06:29 | 显示全部楼层
直接传字符:
最简单的过滤器是字符串.在搜索方法中传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容,下面的例子用于查找文档中所有的<b>标签
传正则表达式:
如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下面例子中找出所有以b开头的标签,这表示<body>和<b>标签都应该被找到

  1. import re
  2. for tag in soup.find_all(re.compile("^b")):
  3.     print(tag.name)
  4. # body
  5. # b
复制代码

3.传入一个列表.
返回以这个列表元素为标签的内容
C.传列表

如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回.下面代码找到文档中所有<a>标签和<b>标签


  1. soup.find_all(["a", "b"])
  2. # [<b>The Dormouse's story</b>,
  3. #  <a class="sister"  id="link1">Elsie</a>,
  4. #  <a class="sister"  id="link2">Lacie</a>,
  5. #  <a class="sister"  id="link3">Tillie</a>]
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
  11. soup.find_all(["a", "b"])
  12. # [<b>The Dormouse's story</b>,
  13. #  <a class="sister"  id="link1">Elsie</a>,
  14. #  <a class="sister"  id="link2">Lacie</a>,
  15. #  <a class="sister"  id="link3">Tillie</a>]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-21 17:42:11 | 显示全部楼层
BlueSand 发表于 2018-5-21 16:06
直接传字符:
最简单的过滤器是字符串.在搜索方法中传入一个字符串参数,Beautiful Soup会查找与字符串完整 ...

其实我比较疑惑的是
  1. for each in soup.find_all(href=re.compile("view")):
复制代码

这句话里,re.compile('view')为何能表示'href里有view关键字'这个概念.为何不写成href = re.compile('www\..+/view.com')之类的表达式,view代表的应该只是view这个单词本身,它不是一个正则表达式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-22 08:24:58 | 显示全部楼层
黄金猫 发表于 2018-5-21 17:42
其实我比较疑惑的是

这句话里,re.compile('view')为何能表示'href里有view关键字'这个概念.为何不写成 ...

正则表达式 p1 = "view" 表达的就是含有view这个关键字的
你去看一下正则表达式,这个是最基础的表达式.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 07:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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