html = """
HTML文档
"""
from bs4 import BeautifulSoup
'''Teg和BeautifulSoup'''
soup = BeautifulSoup(html, 'lxml')
# BeautifulSoup是Tag经过更深层次的封装,里面有很多方法(创建、插入、删除标签等),但是一般用的不多,只是用它来创建个对象,然后再经过创建的对象来查询匹配
print(type(soup)) # <class 'bs4.BeautifulSoup'> 就是from bs4 import BeautifulSoup这个模块 继承自Tag
table = soup.find('table')
print(type(table)) # <class 'bs4.element.Tag'> => from bs4.element import Tag
table.find_all('tr')
# soup、table 都可以使用 find_all、find等一些方法 因为BeautifulSoup find find_all都是继承自Tag
# BeautifulSoup继承自Tag -> soup = BeautifulSoup(html, 'lxml') -> table = soup.find('table') -> table.find_all('tr')
# 这样一层一层继承,一层一层的调用,soup能调用的方法 table都能继承了
'''NavigableString'''
div = soup.find('div')
print(type(div.string)) # <class 'bs4.element.NavigableString'>
from bs4.element import NavigableString # 本质上就是Python内置的str加了一些其他的东西
'''注释字符串 Comment'''
p = soup.find('p')
print(p.string) # 用.string可以获取到一个注释的字符串,多行文本获取不到,只要有换行就获取不到
print(p.contents) # 用.contents可以查看获取到的所有字符串,这里可以看到是有换行符的
print(type(p.string)) # <class 'bs4.element.Comment'>
from bs4.element import Comment # 继承自NavigableString的
'''contents和children'''
div2 = soup.find('div')
print(type(div2.contents))
print(div2.contents) # 返回的是个列表
print(type(div2.children))
print(div2.children) # 返回的是个迭代器 <class 'list_iterator'>
'''两个都可以通过遍历来获取到匹配到的内容'''
总结:
四个常用的对象:
Beautiful Soup将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是Python对象
所有对象可以归纳为四种:
- Tag:BeautifulSoup中所有的标签都是Tag类型,并且BeautifulSoup的对象本质上也是一个Tag类型,所以find、find_all…这些方法并不是BeautifulSoup的,而是继承自Tag的
- NavigableString:继承自Python中的str,用起来跟使用Python的str区别不大
- BeautifulSoup:继承自Tag,用来生成BeautifulSoup树的,对于一些查找方法,如:find、find_all、seIect等,其实还是来自于Tag类的
- Comment:继承自NavigableString
contents和children:
返回某个标签下的直接子元素,包括字符串和空白字符。区别:contents返回一个列表,children返回的是迭代器