html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
from bs4 import BeautifulSoup #一、标签选择器
soup = BeautifulSoup(html,'lxml')
print(soup.prettify())#自动进行格式化处理,补全标签等
print(soup.title.string)#得到title标签里的内容,获取x里面的内容用soup.x.string
print(soup.title)#获取title标签
print(soup.title.name)#获得标签的名称,注意是标签
print(soup.head)#获取head标签
print(soup.p)#匹配第一个p标签
print(soup.p['name'])#获取p标签的属性即后面的name部分<p class="title" name="dromouse">
print(soup.head.title.string)#可以进行嵌套层层剥离标签
print(soup.p.contents)#获取p标签的所有子节点,以列表形式返回
print(soup.p.children)#返回迭代器,可以以循环方式遍历p标签的子节点
for i,child in enumerate(soup.p.children):
print(i,child)
print(soup.p.descendants)#返回迭代器,获取所有的子孙节点
print(soup.a.parent)#获取a标签的父节点信息
print(soup.a.parents)#获取祖先节点
print(soup.a.next_siblings)#返回迭代器,下一个兄弟节点
print(soup.a.previous_siblings)#返回迭代器,前一个兄弟节点 #二、标准选择器 html='''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1" name="elements">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>
'''
#find_all
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml') print(soup.find_all('ul'))#查找ul标签所有内容 print(soup.find_all(attrs={'id':'list-1'}))#可以将attrs传入字典以完成查找
print(soup.find_all(id='list-1'))#可以简写,不用传入attrs
print(soup.find_all(class_='element'))#可以简写
print(soup.find_all(text='Foo'))#可以匹配到foo '''
#find与find_all用法一致,只是返回第一个元素
find_parents() find_parent()
find_parents()返回所有祖先节点,find_parent()返回直接父节点。
find_next_siblings() find_next_sibling()
find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。
find_previous_siblings() find_previous_sibling()
find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点。
find_all_next() find_next()
find_all_next()返回节点后所有符合条件的节点, find_next()返回第一个符合条件的节点
find_all_previous() 和 find_previous()
find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点 '''
print('*'*200)
#css选择器
print(soup.select('.panel .panel-heading'))#用.代替class
print(soup.select('ul li'))#找到ul li的所有标签
print(soup.select('#list-2 .element'))#用#代替id
for ul in soup.select('ul'):#获取ul标签
print(ul['id'])#获取ul标签的id属性
for ul in soup.select('ul'):
print(ul.get_text())#获取ul的文本内容 #总结:
# 推荐使用lxml解析库,必要时使用html.parser
#标签选择器筛选功能弱但是速度极快
#建议使用find(),findall()查询匹配单个结果或者多个结果
#如果对css选择器熟悉建议使用select()
#记住常用的获取属性和文本的方法