【BOOK】解析库--Beautiful Soup

1、安装bs4库

2、解析器

 

3、节点选择器

from bs4 import BeautifulSoup
html = '''
<html>
<head><title>这是标题</title></head>
<body>
<p class="title" name="dromouse"><b>这是标题</b></p>
<p class="story" >从前有座山
<a href="http://www.baidu.com/1" class="sister" id="link1">链接1</a>
<a href="http://www.baidu.com/2" class="sister" id="link2">链接2</a>
    <a href="http://www.baidu.com/3" class="sister" id="link3">链接3</a>
完了</p>
</body></html>
'''
soup = BeautifulSoup(html, 'lxml')

## prettify()把要解析的字符串以标准的缩进格式输出
print(soup.prettify())

## 获取head节点
print(soup.head)  # <head><title>这是标题</title></head>

## 获取p节点,返回第一个p节点
print(soup.p)

## 获取节点名称--name
print(soup.title.name) # title

## 获取节点属性--attrs
print(soup.p.attrs) # {'class': ['title'], 'name': 'dromouse'}
print(soup.p.attrs['class']) # ['title']
## 简写
print(soup.p['class']) # ['title'],返回列表,因为class属性可以有多个值
print(soup.p['name']) #dromouse,返回字符串,因为name属性只能有一个值

## 获取节点的文本
print(soup.p.string) # 这是标题

## 嵌套选择
print(soup.head.title) # <title>这是标题</title>

 

from bs4 import BeautifulSoup
html = '''
<html>
<head><title>这是标题</title></head>
<body>

<p class="story" >从前有座山
<a href="http://www.baidu.com/1" class="sister" id="link1">链接1</a>
<a href="http://www.baidu.com/2" class="sister" id="link2"><span>链接2</span></a>
    <a href="http://www.baidu.com/3" class="sister" id="link3">链接3</a>
完了</p>
</body></html>
'''
soup = BeautifulSoup(html, 'lxml')

## 关联选择
## 子节点 & 子孙节点

## contents属性,返回列表,包含p节点的每一个子节点
print(soup.p.contents)

## children属性,返回所有子节点,生成器类型,用for循环输出
print(soup.p.children) ## <list_iterator object at 0x0353BF10>
for child in enumerate(soup.p.children):
    print(child) ## 7个元素,包括 \n

## descendants属性,返回所有子孙节点,生成器类型,用for循环输出
print(soup.p.descendants) ## <generator object Tag.descendants at 0x03915330>
for child in enumerate(soup.p.descendants):
    print(child)


# 父节点 & 祖先节点
# parent属性,返回a节点的直接父节点 p
print(soup.a.parent)

## parents属性,返回所有祖先节点,生成器类型
print(list(enumerate(soup.a.parents)))

## 兄弟节点
print('下一个兄弟', soup.a.next_sibling)
print('上一个兄弟', soup.a.previous_sibling)
print('所有前面的兄弟', list(enumerate(soup.a.next_siblings)))
print('所有后面的兄弟', list(enumerate(soup.a.previous_siblings)))

 

4、方法选择器

(1)find_all(name, attrs, recursive, text, **kwgrgs)   

    返回所有匹配结果,列表类型

html = '''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element">BBB</li>
            <li class="element">BBB CCC</li>
            <li class="element">GGG</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">HHH</li>
            <li class="element">YYY</li>
            <li class="element">VVV</li>
        </ul>
    </div>
</div>
'''

from bs4 import BeautifulSoup
import re

soup = BeautifulSoup(html,'lxml')

# name—根据节点名查询,返回列表,每个元素类型为Tag类型
print(soup.find_all(name='ul'))

for ul in soup.find_all(name='ul'):
    for li in ul.find_all(name='li'):
        print(li.string)

# attrs--属性查询,参数类型是字典类型,返回列表类型
print(soup.find_all(attrs={'class':'element'}))
## id,class属性为常用属性,可以不用字典形式
print(soup.find_all(class_='element'))
print(soup.find_all(id='list-1'))

# text--匹配节点的文本,传入参数可以是字符串或者正则表达式
print(soup.find_all(text='BBB'))
print(soup.find_all(text=re.compile('BBB'))) # ['BBB', 'BBB CCC']

(2)     find()  返回第一个匹配结果,Tag类型

(3)     find_parents()  返回所有祖先节点

    find_parent()  返回父亲节点

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

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

(5)     find_previous_siblings()  返回所有前面的兄弟节点

    find_ previous _sibling()  返回第一个前面的兄弟节点

(6)     find_all_next ()  返回所有后面的节点

    find_next ()  返回第一个后面的节点

(7)     find_all_previous ()  返回所有前面的节点

    find_ previous ()  返回第一个前面的节点

 

 

5、CSS选择器

 

select()

html = '''
 <div class="panel">
     <div class="panel-heading">
         <h4>Hello</h4>
     </div>
     <div class="panel-body">
         <ul class="list" id="list-1">
             <li class="element">BBB</li>
             <li class="element">BBB CCC</li>
             <li class="element">GGG</li>
         </ul>
         <ul class="list list-small" id="list-2">
             <li class="element">HHH</li>
             <li class="element">YYY</li>
             <li class="element">VVV</li>
         </ul>
    </div>
</div>
 '''

from bs4 import BeautifulSoup
import re

soup = BeautifulSoup(html,'lxml')
print(soup.select('.panel-heading')) ## class属性值为 panel-heading
print(soup.select('li')) ## 返回列表类型,列表元素为Tag类型
print(soup.select('#list-2 .element'))

## 嵌套选择
for ul in soup.select('ul'):
    print(ul.select('li'))

## 获取属性
for ul in soup.select('ul'):
    print(ul['id'])
    ## 或者
    print(ul.attrs['id'])

## 获取文本 get_text()
for li in soup.select('li'):
    print('获得文本:', li.get_text())
    print('或者:', li.string)

  

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

posted @ 2020-03-19 12:00  kuluma  阅读(177)  评论(0编辑  收藏  举报