# -*- coding: utf-8 -*-

'''
# Author : Solomon Xie
# Usage : 测试BeautifulSoup一些用法及容易出bug的地方
# Enviroment: Python 2.7, Windows 7 (32bit), Chinese Language Pack
''' import time, re
import bs4 # 必须导入,因为需要做一些bs4专有类型的判断
from bs4 import BeautifulSoup def test_BeautifulSoup():
"""
# BeautifulSoup的一些问题实在让人蛋大。
# 这里研究下吧。
"""
'''
# 基础部分
# 关于bs4的解析速度 #################
# 仔细阅读文档后发现,文档解析器对速度至关重要!
# 如果没有安装cchardet模块,那么光一个网页就要7秒!!
# 还不包括获取网页时间。然而试过后,如过山车一般:
# 安装了cchardet以后7秒变成了一瞬。
# 然而,用了几天后又变回了7秒,卸载了cchardet又变回了一瞬间!
# 另外,BeautifulSoup升级到4以后,导入方法变了,如下:
'''
from bs4 import BeautifulSoup '''
# 关于被解析文档的编码格式 ##########
# 又不淡定了,官方说无论被传入什么编码的文档,都会被统一为unicode
# 实际上有时候我发现,必须以unicode传入才能获得正确结果。。。
# 这里试验发现,还真的是如此!必须传入decode过的码
'''
html_doc = open('test-Zhilian-list-page-sm1.html', 'r').read().decode('utf-8')
# ^ 这个html文件其实是智联招聘搜索页的源码,可以自己保存下来直接试一试。 '''
# 关于bs4的文档解析器 ##############
# 又是一个大坑:bs升级到4后,实例化时需要明确指定文档解析器,如:
# soup = BeautifulSoup(html_doc, 'lxml')
# 但是著名的lxml在这里就是个大坑啊,
# 因为它会直接略过html所有没写规范的tag,而不管人家多在乎那些信息
# 因为这个解析器的事,我少说也折腾了好几个小时才找到原因吧。
# 总结:记住,选择html5lib!效率没查多少,最起码容错率强,不会乱删你东西!
'''
soup = BeautifulSoup(html_doc, 'html5lib') '''
# 关于bs4的输出格式 #################
# prettify()官方解释是一律输出utf-8格式,
# 其实却是unicode类型!!所以必须在prettify()里面指定编码。
'''
# output = soup.prettify('utf-8')
# print repr(output) '''
# 所谓的多种搜索节点方式##############
就是不知道为什么:
无论怎么测验,find()和find_all()就是死活不管用!
只有用官方文档里的英文版《爱丽丝》测试才没问题。
也就是说,问题还是出在了文字编码上?
可是当我试着查找英文时,搜索结果还是为零-_-!
到了最后,bs4中众多的搜索工具上,
唯一能用的就是select()了,即CSS选择器。
虽然极其好用,但还是有限制性。
不死心,所以我还是再试验一下find_all()的毛病吧。
'''
# == find_all()之搜索标签名称 ============ OK
# result = soup.find_all('dl') # OK # == find_all()之搜索标签属性 ============ not all OK
# result = soup.find_all(id='newlist_list_div') # OK
# result = soup.find_all(href=re.compile('.htm')) # Failed 竟然不支持href搜索,和官方说的不一样
# result = soup.find_all(name='vacancyid') # Failed 不支持标签的name属性搜索 # == find_all()之按CSS搜索 ============ OK
# result = soup.find_all('div', class_='clearfix') # OK
# result = soup.find_all('div', class_=re.compile('newlist_detail')) # OK
# result = soup.find_all(class_=re.compile('newlist_detail')) # OK # == find_all()之按内容text搜索 ============
# find_all()加上text参数后,
# 返回的是字符串!而不是tag!!
# 类型为:<class 'bs4.element.NavigableString'>
# result = soup.find_all(text='会计') # OK 内容必须完全相等才算!(不含子标签)
# result = soup.find_all(text=u'数据') # OK 内容必须完全相等 无所谓unicode了
# result = soup.find_all(text=re.compile(u'学历:')) # OK unicode是绝对要!否则不行! # == select() , CSS选择器搜索引擎 ============
'''
CSS选择器的语法请看w3cschool的文档:
http://www.w3school.com.cn/cssref/selector_nth-of-type.asp
下面总结了在BeautifulSoup中的语法搜索:
标签搜索,如:'input' ,搜索所有标签为input的元素
宽泛路径,如:'body a' ,就是body内所有a元素
绝对路径,如:'body > div > div > p' ,必须完全符合路径才能搜到
ID搜索 ,如:'#tag-1' ,搜索id为tag1的标签
混合搜索,如:'div #tag1', 搜索id为xx的div标签
'div[class*=newlist_detail] ~ div[class*=newlist_detail]' ,大混合
属性存在,如:'a[href]' ,搜索所有存在href属性的a标签
类名搜索,如:'[class=clearfix]' ,找到class名等于clearfix的标签
'[class^=newlist_detail]' ,找到class名中以"newlist_detail"开头的标签
'[class$=zwmc]' ,找到class名中以"zwmc"结尾的标签
'[class*=clearfix]' ,找到class名中包含"zwmc"的标签
兄弟搜索,如:
'#links ~ .clearfix' ,找到id为links标签的所有class等于"clearfix"的兄弟标签
'#links + .clearfix' ,找到id为links标签的下一个class等于"clearfix"的兄弟标签
序列搜索,如:'p nth-of-type(3)' ,这个说白了就是选择第3个p标签
'p nth-of-type(odd)' 表示奇数的p标签
'p nth-of-type(even)' 表示偶数的p标签
'p nth-of-type(n)' 表示所有的p标签
'p nth-of-type(3n)' 表示3的倍数的p标签
'p nth-of-type(4n+1)' 表示4的倍数加1的p标签,如第5个、第9个
'''
# result = soup.select('dl > p') # OK tag路径搜索
# result = soup.select('div[class*=newlist_detail] ~ div') # OK 各种混合搜索
# result = soup.select('[class*=zwmc]') # OK 各种混合搜索
con = soup.select('div[class^=newlist_detail]')[0]
result = con.select('[class*=zwmc]')
# print type(result[0]) print len(result) # out = soup.select('[class*=zwmc]')
# print len(out)
# for item in out:
# print item.get_text().encode('utf-8') def bsText(tags=[], info=''):
if len(tags):
t = tags[0] # 因为只会有一个对象
# select()选择器返回的是tag标签
# 而find_all()用text查询是返回的是字符串!
if isinstance(t, bs4.element.Tag):
return t.get_text().encode('utf-8')
elif isinstance(t, bs4.element.NavigableString):
return t.string.encode('utf-8')
else:
return '无[%s]信息'%info # 计算时间
def timeup(func):
start = time.clock()
func()
end = time.clock()
timeuse = end-start
print '\n[%s()]函数一共使用了%d秒时间。\n' %(func.__name__, timeuse)
return timeuse if __name__ == '__main__':
timeup(test_BeautifulSoup)

BeautifulSoup :功能使用的更多相关文章

  1. 第14.13节 BeautifulSoup的其他功能导览

    前面<第14.9节 Python中使用urllib.request+BeautifulSoup获取url访问的基本信息 >.<第14.10节 Python中使用BeautifulSo ...

  2. selenium+BeautifulSoup实现强大的爬虫功能

    sublime下运行 1 下载并安装必要的插件 BeautifulSoup selenium phantomjs 采用方式可以下载后安装,本文采用pip pip install BeautifulSo ...

  3. 一个超实用的python爬虫功能使用 requests BeautifulSoup

    一个简单的数据爬取的示例 import os,re import requests import random import time from bs4 import BeautifulSoup us ...

  4. Python爬虫小白入门(三)BeautifulSoup库

    # 一.前言 *** 上一篇演示了如何使用requests模块向网站发送http请求,获取到网页的HTML数据.这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据. ...

  5. BeautifulSoup 的用法

    转自:http://cuiqingcai.com/1319.html Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python ...

  6. 7月17日——高校就业信息网站功能及数据获取之python爬虫

    本周我们小组在分析上周用户需求之后,确定了网站的主要框架和功能.数据收集和存储方式,以及项目任务分配. 一.网站的主要框架和功能. 网站近期将要实现的主要功能有,先重点收集高校(华东五校)就业宣讲会的 ...

  7. urllib+BeautifulSoup无登录模式爬取豆瓣电影Top250

    对于简单的爬虫任务,尤其对于初学者,urllib+BeautifulSoup足以满足大部分的任务. 1.urllib是Python3自带的库,不需要安装,但是BeautifulSoup却是需要安装的. ...

  8. 利用BeautifulSoup抓取新浪网页新闻的内容

    第一次写的小爬虫,python确实功能很强大,二十来行的代码抓取内容并存储为一个txt文本 直接上代码 #coding = 'utf-8' import requests from bs4 impor ...

  9. pythn BeautifulSoup

    http://rsj217.diandian.com/post/2012-11-01/40041235132 Beautiful Soup 是用 Python 写的一个 HTML/XML 的解析器,它 ...

随机推荐

  1. iOS:GCD理解1(同步-异步、串行-并行)

    1.并行-异步(ST1与ST2抢占资源) 1-1).获取 并行(全局)队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t queu ...

  2. iOS7之后设置NavigationBar的背景

    iOS7之后,请注意需要使用setBarTintColor ``` [self.navigationController.navigationBar setBarTintColor:[UIColor ...

  3. jquery双向列表选择器DIV模拟版

    前段时间项目需要用到双向列表选择,想直接用select,结果发现某些样式不支持,只好用div模拟了以下,功能基本实现能用了,需要其他功能自己加上,譬如列表里展示多列数据等. select版链接:htt ...

  4. jquery 元素控制(追加元素/追加内容)

    参考网址:http://www.jquerycn.cn/a_5521 一.在元素内部/外部追加元素 append,prepend:添加到子元素 before,after:作为兄弟元素添加 html: ...

  5. YII2 载入默认值 loadDefaultValues

    本人很懒,所以喜欢找现成的东西来用,所以在载入默认值的时候我直接就选择了Yii2 自带的loadDefaultValues 问题来了,我提交的时候发现我在rules里面设置的default没有工作 [ ...

  6. 如何监控ORACLE索引使用与否

    在数据库管理与维护中,我们总会遇到一个问题:我们创建的索引是否会被某些SQL语句使用呢?换个通俗表达方式:我创建的索引是否是未使用的索引(unused Indexes),是否有价值呢?如果创建的某个索 ...

  7. mysql limit分页查询优化写法

    在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用orderby排 序.但是在表数据量比较大的时候,例如查询语句片段limit 10000, 20,数据库会读取10020条 ...

  8. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  9. 【原】让H5页面适配移动设备全家 - 设计师篇 - PPT

    上一篇文章<pageResponse - 让H5适配移动设备全家>中分享了一个小插件让一套H5页面适配几乎所有移动设备,得到了一些同学的推荐和认可,这里感谢大家的支持. 在此之前也在部门前 ...

  10. iOS CoreAnimation详解(一) 有关Layer的动画

    以前由于项目需要 也写了一些动画 ,但是知识不系统,很散.这段时间趁着项目完成的空袭,来跟着大神的脚步系统的总结一下iOS中Core Animation的知识点. 原博客地址:http://blog. ...