Beautiful Soup

Beautiful Soup

Beautiful Soup提供一些简单的、 Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序
Beautiful soυp自动将输入文档转换为 Unicode编码,输岀文档转换为UTF-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时你仅仅需要说明一下原始編码方式就可以了。
Beautiful Soup已成为和lxml、html6ib一样出色的 Python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

基本用法

from bs4 import BeautifulSoup

import re


html = '''<ul class="m-list">
<li><a class="title" title="宿舍违规电器领回办理流程图" id="157" href="/houqin/gyxsgy/index.php/Home/News/showarticle/id/157">宿舍违规电器领回办理流程图</a><span class="date">[2017-01-10]</span></li>
<li><a class="title" title="学生申请假期住校办理流程图" id="156" href="/houqin/gyxsgy/index.php/Home/News/showarticle/id/156">学生申请假期住校办理流程图</a><span class="date">[2017-01-10]</span></li>
<li><a class="title" title="学生公寓区宣传品申请张贴办理流程图" id="155" href="/houqin/gyxsgy/index.php/Home/News/showarticle/id/155">学生公寓区宣传品申请张贴办理流程图</a><span class="date">[2017-01-10]</span></li>
<li><a class="title" title="学生公寓物品外借办理流程图" id="154" href="/houqin/gyxsgy/index.php/Home/News/showarticle/id/154">学生公寓物品外借办理流程图</a><span class="date">[2017-01-10]</span></li>
<li><a class="title" title="学生申请住宿办理流程图" id="153" href="/houqin/gyxsgy/index.php/Home/News/showarticle/id/153">学生申请住宿办理流程图</a><span class="date">[2017-01-10]</span></li>
<li><a class="title" title="学生宿舍调整办理流程图" id="152" href="/houqin/gyxsgy/index.php/Home/News/showarticle/id/152">学生宿舍调整办理流程图</a><span class="date">[2017-01-10]</span></li>                    
</ul>'''

soup = BeautifulSoup(html,'lxml')
print(soup.prettify())  #prettify方法可以把要解析的字符串以标准的缩进格式输出
print(soup.a.string)    #选择Html节点中title节点,并通过string属性获取节点内容,这种选择模式只会选择到第一个匹配的点,其他后面节点就会忽略
print(soup.a.name)      #通过name属性获取节点名称
print(soup.a.attrs)     #调用attrs获取所有属性
print(soup.a.attrs['id']) #因为attrs的返回结果是字典形式,所以,要获取”id“属性,就相当于从字典中获取某个键值,只需要用中括号加属性名就可以了

print(type(soup.li.a))      #因为返回的结果是bs4.element.Tag类型
print(soup.li.a.string)     #所以可以进行嵌套选择
print(soup.li.content)      # content属性返回的结果是直接子孙节点的列表

##同样地,也可以用children属性获取获取直接子节点的列表,用descendants属性获取子孙节点,用parent属性获取父节点,用parents属性获取所有祖宗节点
print(soup.li.children)     #返回的结果类型是生成器类型
for i,child in enumerate(soup.li.children):
    print(i,child)

##next_sibling和 previous_sibling分别获取节点的下一个和上一个兄弟元素, next_siblings和 previous_siblings则分别返回所有前面和后面的兄弟节点的生成器。
print('Next Sibling', soup.a.next_sibling)
print('Prev Sibling', soup.li.previous_sibling)
print('Next Siblings', list(enumerate(soup.a.next_siblings)))
print('Prev Siblings', list(enumerate(soup.li.previous_siblings)))

方法选择器

print(soup.find_all(name = "ul"))   #根据节点名来查询元素
print(type(soup.find_all(name = "ul")[0]))

#同样的,还可以传入一些属性进行查询
print(soup.find_all(attrs={'class':"title"}))
print(soup.find_all(attrs={'id':'153'}))
print(soup.find_all(attrs={'name':"li"}))

#text参数可用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象
print(soup.find_all(text=re.compile('学生')))

'''find_all()和find():前者返回所有匹配的元素组成的列表,后者返回单个元素
find_parents()和 find_parent():前者返回所有祖先节点,后者返回直接父节点。
find_next_siblings()和 find_next_sibling():前者返回后面所有的兄弟节点,后者返回后面
第一个兄弟节点。
find_previous_sib1ings()和 find_previous_sibling():前者返回前面所有的兄弟节点,后者
返回前面第一个兄弟节点
find_ all_next()和 find_next():前者返回节点后所有符合条件的节点,后者返回第一个符合
条件的节点。
find_ all previous()和 find_previous():前者返回节点后所有符合条件的节点,后者返回第
个符合条件的节点。'''

## css选择器
#使用css选择器时,只需要调用select()方法,传入相应的css选择器即可
print(soup.select('.title'))
print(soup.select('ul li'))

#获取属性
for li in soup.select('li a'):
    print(li['class'])
    print(li.attrs['id'])

#获取文本
for li in soup.select('li a'):
    print(li.string)
    print(li.get_text())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值