BeautifulSoup :功能使用

# -*- 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)
时间: 2024-11-11 05:54:08

BeautifulSoup :功能使用的相关文章

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

import urllib import os,refrom urllib import request, parseimport requestsimport randomimport timefrom bs4 import BeautifulSoup user_agent_list = [ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/5

python爬虫从入门到放弃(六)之 BeautifulSoup库的使用

上一篇文章的正则,其实对很多人来说用起来是不方便的,加上需要记很多规则,所以用起来不是特别熟练,而这节我们提到的beautifulsoup就是一个非常强大的工具,爬虫利器. beautifulSoup “美味的汤,绿色的浓汤” 一个灵活又方便的网页解析库,处理高效,支持多种解析器.利用它就不用编写正则表达式也能方便的实现网页信息的抓取 快速使用 通过下面的一个例子,对bs4有个简单的了解,以及看一下它的强大之处: from bs4 import BeautifulSoup html = '''

BeautifulSoup 的用法

转自:http://cuiqingcai.com/1319.html Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐安装. <thead”> 解析器 使用方法 优势 劣势 Python标准库 BeautifulSoup(markup, “html.parser”) Python的内置标准库 执行速度适中 文档容错能力强 Python 2

Python 爬虫-BeautifulSoup

2017-07-26 10:10:11 Beautiful Soup可以解析html 和 xml 格式的文件. Beautiful Soup库是解析.遍历.维护"标签树"的功能库.使用BeautifulSoup库非常简单,只需要两行代码,就可以完成BeautifulSoup类的创建,这里命名为soup,接下来就可以对soup进行相关处理了.一个BeautifulSoup类对应html或者xml的全部内容. BeautifulSoup库将任意html文件转换成utf-8格式 一.解析器

[爬虫] BeautifulSoup库

Beautiful Soup库基础知识 Beautiful Soup库是解析xml和html的功能库.html.xml大都是一对一对的标签构成,所以Beautiful Soup库是解析.遍历.维护"标签树"的功能库,只要提供的是标签类型Beautiful Soup库都可以进行很好的解析. Beauti Soup库的导入 from bs4 import BeautifulSoup import bs4 html文档 == 标签树 == BeautifulSoup类   可以认为三者是等价

【python】--BeautifulSoup

背景 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序. Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码.你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautif

微信公众号+python+新浪SAE实现实时天气预报功能

本文主要谈谈如何做一个具有天气预报功能的公众号. 话不多说先上图,实现的功能如下图所示: 点击微信右下角的"+"号,分享任意一个位置信息,公众号后台自动回复当地的天气情况.这里的天气预报是用python从中国天气网抓取的雷达数据.有没有更精准的数据源呢,当然有啦,但这不是本文的重点,这里我就不详说了. 用到的工具:新浪SAE + 微信公众平台 + python2.7(新浪SAE目前仅支持2.7版本) 由于本文的重点不是使用python搭建微信公众平台,网上已经有很多不错的教程,为了避免

python爬虫学习日历2【基于ubuntu系统】beautifulsoup的强大之处

前一篇小文中就提到了python的requests库可以获取网络编码中的所有内容,我们获取了自然就必须对它进行加工处理,就像我们学习一样,一本书,我们可以轻易的获取,但是它究竟是在讲哲学还是讲历史呢还是其他云云,需要我们认真分析,取其精华去其糟粕.而在python当然也有做这个工作的'人',就是我们需要安装库中的'beautifulsoup' 我本来是想继续用昨天的网址来说明的,不过效果不佳,我一会这这篇小文的最后会附上源代码,供各位朋友或者自己再次的学习 html_doc = ""&

[python爬虫]简单爬虫功能

在我们日常上网浏览网页的时候,经常会看到某个网站中一些好看的图片,它们可能存在在很多页面当中,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片鼠标右键的时候并没有另存为选项,还有办法就通过就是通过截图工具截取下来,但这样就降低图片的清晰度.就算可以弄下来,但是我们需要几千个页面当中的图片,如果一个一个下载,你的手将残.好吧-!其实你很厉害的,右键查看页面源代码. 我们可以通过python 来实现这样一个简单的爬