# -*- 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. tuple放入dict中

    tuple放入dict中是否可以正常运行 # 将tuple放入dict中 a = ('AI','Kobe','Yao') b = ('AI',['Kobe','Yao']) dict1 = {'a': ...

  2. js生成和下载二维码

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  3. the request resource is not available

    form表单递交数据的问题 我的解决方法 将要访问的servlet地址写入form的action中 例如:访问地址为http://localhost:8080/Webprojectselfservic ...

  4. [Erlang 0127] Term sharing in Erlang/OTP 上篇

    之前,在 [Erlang 0126] 我们读过的Erlang论文 提到过下面这篇论文: On Preserving Term Sharing in the Erlang Virtual Machine ...

  5. 在Ubuntu上搭建Hadoop群集

    前面我搭建的Hadoop都是单机伪分布式的,并不能真正感受到Hadoop的最大特点,分布式存储和分布式计算.所以我打算在虚拟机中同时开启3台机器,实现分布式的Hadoop群集. 1.准备3台Ubunt ...

  6. CSS3:linear-gradient,线性渐变的使用方法

    CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡. 以前,你必须使用图像来实现这些效果,现在通过使用 CSS3 的渐变(gradients)即可实现.此外,渐变效果 ...

  7. 使用fdisk给新增加硬盘分区

    1.使用fdisk创建6个分区[1P+1E(5L)]   //dev/sdb1 /dev/sdb5 /dev/sdb6 /dev/sdb7 /dev/sdb8 /deb/sdb9 [root@serv ...

  8. css实现网页表格

    一. 准备工作 1. 点击此下载 相关文件 二. 在浏览器中运行 table.html 文件,即可看到效果 三. 效果图

  9. 文本处理三剑客之sed命令

    第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...

  10. Logcat使用总结

    不建议用System.out.println(), 因为使用syso导致日志打印不可控制.打印时间无法确定.不能添加过滤器.日志没有级别区分等为题. Android中的日志工具类是Log(androi ...