Python探索之路之BeautifulSoup

BeautifulSoup的使用方法

beautifulsoup中的解析库有5种:

(1) parser : python标准库,效率适中,容错能力强

(2) lxml : 需要安装,最常用的一个解析库,速度快,文档容错能力强

(3) xml : 需要安装,唯一支持xml的解析器,速度快

(4) html5lib : 容错能力最强,使用浏览器的方式解析,但速度慢,不依赖外部扩展

引入包

from bs4 import BeautifulSoup as BS

网页源码

html = 
‘<html>
<head><title> The dormouse's story</title></head>
<body>
<p class="title"name="dromouse"><b> The dormouse's story</b></p>
<a href="http://example.com/elsie",class="sister",id"link1><l--elsie->
<a href="http://example.com/lacie",class="sister",id="link2">Lacie</a>
<a href="http://example.com/tille",classm"slster",id="link">Tilie</a>
<p class="story">Once upon a time there were three little sisters; and their names were’

基本使用

声明一个BeautifulSoup对象:

soup = BS(html,’lxml’)
print(soup.prettify()) #打印格式化传入的代码
print(soup.title.string) #打印出title内容

1.标签选择器

    类似于soup.title.string

            (1) print(soup.title)

                <title>xxxxxx</title> #得到标签与标签内容

            (2) print(soup.head)

                <head><title>xxxxxx</title></head> #得到标签与标签内容

            (3) print(soup.p) #只打印打一个p标签所包含的内容

                <p class="title"name="dromouse"><b> The dormouse's story</b></p>


1) 获取名称

    soup.title.name # 返回title标签名

2) 获取属性

         两种方法:
    print(soup.p.attrs[‘name’])
    dromouse
    print(soup.p[‘name’])
    dromouse     

3) 获取内容

soup.title.string
soup.p.string

4) 嵌套选择

soup = BS(html,’lxml’)
print(soup.head.title.string) # 以此类推可以得到其他的
The dormouse's story

5)子节点和子孙节点

(1)print(soup.p.contents)
打印得到一个列表
[‘\n’,’<a href="http://example.com/elsie"class="sister"id"link1><l--elsie->’,...]

(2) print(soup.p.children) # 得到的是一个迭代器,list_iterator object
    for index,child in enumerate(soup.p.children)
    # enumerate()方法会返回索引和内容,这里分别用index和child接受
        print(index, child) #打印索引和节点内容

(3) print(soup.p.descendants) # 得到的是一个迭代器,list_iterator object
    for index,child in enumerate(soup.p.descendants)
        print(index, child) #打印索引和所有子孙节点的内容

6) 父节点和祖先节点

父节点:print(soup.a.parent)
祖先节点:print(list(enumerate(soup.a.parents)))

7) 兄弟节点

print(list(enumerate(soup.a.next_siblings)))
打印后面的兄弟节点
print(list(enumerate(soup.a.previous_siblings)))
打印前面的兄弟节点
2.标准选择器
1.find()
2.find_all()
3.find_parent()
4.find_parents()
5.find_next_sibling()
6.find_next_siblings()
7.find_previous_sibling()
8.find_previous_siblings()
9.find_previous()
10.find_all_previous()
11.find_next()
12.find_all_next()

1) find_all(name,attrs,recursive,text,limit,**kwargs)

    name参数为标签名

    Attrs参数为标签属性

    Text参数是根据源码中的文本进行选择

    find_all(text=’Tilie’),返回文本值

    limit参数可以限制我们得到的结果的个数

    例:find_all(‘p’)

    find_all(attrs={‘id’:’link1’})或者find_all(id=’link1’)

    需要注意的是find_all(class_=’sister’)中class_,因为class是python的个关键字,所以这里需要加上_变成class_,返回的是标签与内容

2) find(name,attrs,recursive,text,**kwargs()

    find返回单个元素

    find_all返回全部元素

3) find_parent()与find_parents()

    find_parent()返回父节点

    find_parents()祖先节点

4) find_next_sibling()与find_next_siblings()

    find_next_sibling()返回后一个兄弟节点

    find_next_siblings()返回后面所有兄弟节点

5) find_previous_sibling()与find_previous_siblings()

    find_next_sibling()返回前一个兄弟节点

    find_next_siblings()返回前面所有兄弟节点

6) find_previous()与find_all_previous()

    find_previous()返回节点前符合条件的第一个节点

    find_all_previous()返回节点前符合条件的所有节点

7) find_next()与find_all_next()

    find_previous()返回节点后符合条件的第一个节点

    find_all_previous()返回节点后符合条件的所有节点


3.CSS选择器
html = ‘‘‘
<html>  
   <body>  
       div class="ecopyramid">  
       <ul id="producers">  
            <li class="producerlist">  
                <div class="name">plants</div>  
                <div class="number">100000</div>  
            </li>  
            <li class="producerlist">  
                <div class="name">algae</div>  
                <div class="number">100000</div>  
            </li>  
        </ul> ’’’

通过select直接传入css选择器即可完成选择(#表示id,.表示class)

print(soup.select(‘.producerlist .name’))  #两个class之间有空格
[<div class="name">plants</div>]

print(soup.select(‘li div’))
[<div class="name">plants</div>,  
<div class="number">100000</div>, 
<div class="name">algae</div>,
<div class="number">100000</div>]

print(soup.select(‘#producers .producerlist’))
[<li class="producerlist">  
        <div class="name">plants</div>  
        <div class="number">100000</div>  
        </li>,  
        <li class="producerlist">  
        <div class="name">algae</div>  
         <div class="number">100000</div>  
         </li>]

1) 获取属性

for i in soup.select(‘.producerlist’):
    print(i[‘id’])
    print(i.attrs[‘id’])
for i in soup.select(‘li’):
    print(i[‘id’])
    print(i.attrs[‘id’])

2) 获取内容

for i in soup.select(‘li’):
    print(i.get_text())

总结:1.推荐使用lxml解析库,必要时使用python自带的html.parser
          2.标签选择器功能较弱,但速度快
          3.建议使用find()和find_all()匹配单个或多个结果
          4.熟练使用css选择器select






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值