bs4

from bs4 import BeautifulSoup
from bs4.element import *
data = """
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            <title>beatifulsoup learning note</title>
        <head>
        <body>
            <div id='id1' class = 'parent'>
                <span>i`m son1 <i>哈哈</i> </span>
                <span>i`m son2 </span>
            </div>
            <div id='id2', class = 'parent2'>
                <span>i`m son1 </span>
                <span>i`m son2 </span>
            </div>
            <div>哇哈哈</div>
        </body>
    </html>
    """
soup = BeautifulSoup(data, 'html.parser') # 创建一个实例,并制定解析引擎
#bs4 中的四大对象,Tag, NavigableString, BeautifulSoup, and Comment
#Tag 类似xml,html中的标签,如果学过html的话应该很好理解
#tag 标签都有共同的属性name, attrs 每个属性都以键值对形式存放
#print(soup.head.name)
#title
#print(soup.title)
#meta
#print(soup.meta.attrs)# attrs 所有属性
#print(soup.meta['content']) #访问content属性
#print(soup.meta.has_attr('content')) #判断是否含有某个属性
#header
#print(soup.head)
#body
#print(soup.body)
#=====================BeautifulSoup=======================类似html中的顶层对象 document?
#print(type(soup)) #'bs4.BeautifulSoup'
#print(type(soup.head)) #<class 'bs4.element.Tag'>  嗯暂时就这样理解吧

#=====================NavigableString=====================文本节点,文本字符串
#parent1 = soup.find_all('div') #返回的是 bs4.element.ResultSet包含所有的tag
#print(list(parent1))
parent1 = soup.find('div', id = 'id1') #找到属性为id1的标签
#print(parent1.name) #div

#print(list(parent1.children)) #返回所有的子节点 ['
', <span>i`m son1</span>, '
', <span>i`m son2</span>, '
']
#值得注意的是 children是一个可迭代对象,需要去遍历 当然我们可以通过contents直接取list
#不要忘了
 	 也是一种节点,容易忽略的地方
#print(parent1.contents) #['
', <span>i`m son1</span>, '
', <span>i`m son2</span>, '
']
# 第一个span
#print(parent1.span)#<span>i`m son1 </span>
# span中的文本
#print(parent1.span.string) #可以发现 string只获得纯文本,并包含子节点文本 此时返回了None
#print(parent1.span.text) #可以返回所有的文本
#print(parent1.get_text(strip = True)) #去除换行
#============================next_sibling, next_element, previous_element, previous_sibling, parent, next_siblings==============
#print(parent1.next_sibling.next_sibling) # 注意这里是两个next 因为之前说过
也是一个节点 s
#print(parent1.next_element.next_element)#  <span>i`m son1 <i>哈哈</i> </span>
#print(list(parent1.next_siblings)) #所有的兄弟节点
#print(list(parent1.next_elements)) #当前节点下的所有节点,包括兄弟节点, 子节点


#以上只是总结常用的一些属性,方法,bs4是一个很强大的库,能够处理很复杂的数据环境,远不止这些。
原文地址:https://www.cnblogs.com/alplf123/p/8376460.html