前端测试 还没被玩坏的 robobrowser (4)——从页面上抓取感兴趣的内容

乙醇 · 2015年01月10日 · 1442 次阅读
本帖已被设为精华帖!

背景

本节的知识实际上是属于 Beautiful Soup 的内容。

robobrowser 支持 Beautiful Soup,一般来说通过下面 3 个方法获取页面上感兴趣的内容

  • find
  • find_all
  • select

这一节主要通过一些例子来讲解这几个方法

预备知识

一般来说学习 Beautiful Soup 是需要了解过滤器这个概念的。不过为了让大家能够容易理解,这里暂时屏蔽过滤器的知识,感兴趣的同学可以去官网学习一下。

通过例子学习

这一节里我们的例子还是http://itest.info/courses/2python, selenium 自动化测试班这个页面。

find 方法

find 方法是返回页面上符合条件的第 1 个元素。

#coding: utf-8
import re
from robobrowser import RoboBrowser

url = 'http://itest.info/courses/2'
b = RoboBrowser(history=True)
  b.open(url)

# 通过tag name抓取

#<title>重定向科技</title>
  title = b.find('title')  
  print title.text

# 通过属性(attribute)抓取

# <img id="logo-header" src="/assets/logo-0648b8fb283a9802457da74f0c157b12.png" />
  img = b.find(id='logo-header')
  print img['src']

# <a href="/courses/4">android测试工具自制班</a>
  print b.find(href='/courses/4').text

# <li class="active">python selenium自动化测试班</li>
  print b.find(class_='active', text=re.compile('python')).text


find_all 方法

find_all 方法的用法跟 find 基本相同,但是 find_all 会返回所有符合条件的 tag 的集合 (ResultSet)。

#coding: utf-8
import re
from robobrowser import RoboBrowser

url = 'http://itest.info/courses/2'
b = RoboBrowser(history=True)
  b.open(url)

#页面上所有的a
  all_links = b.find_all('a')  
  for link in all_links:
    print link.text

# 页面上所有class是container的div
    divs = b.find_all(class_='container')
    print divs

# limit 参数控制返回的元素个数

# 页面上前2个p
    first_two_p = b.find_all('p', limit=2)
    print first_two_p

# 如果第1个参数是列表则返回相匹配的集合

# 页面上所有的meta和title
    print b.find_all(['meta', 'img'])


select 方法

select 方法是我最喜欢的方法,该方法支持 css 选择器 (可惜不是全部),返回的是 list。

#coding: utf-8
import re
from robobrowser import RoboBrowser

url = 'http://itest.info/courses/2'
b = RoboBrowser(history=True)
  b.open(url)

#页面上所有的a
  all_links = b.select('a')  
  for link in all_links:
    print link.text

# 页面上所有class是container的div
    divs = b.select('.container')
    print len(divs)

其他技巧

  • 找到页面上所有具有 id 属性的元素b.find_all(id=True)
  • 不递归查找元素。也就是说只在的直接子后代中查找b.find('p', recursive=False)

文本版权归乙醇所有,欢迎转载,但请标明出处。

下一节:Beautiful Soup 的过滤器

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册