#xiaodeng
#python3
#用Beautiful Soup解析html源码
html_doc = """
<html>
<head>
<title>The Dormouse's story</title>
</head>
<body>
<b>测试</b>
<p class="title">
<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>;
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
<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_doc,"html.parser")
#1、补全html代码格式化输出
#print(soup.prettify())
#2、获取html页面标题
#print(soup.title.string)
"""
还有其他类似用法:
1)print(soup.title.title) #result:title
2)print(soup.title.name) #result:title
"""
#3、查找所有的p标签和p标签的内容,返回一个list
#print(soup.find_all("p"))
#print(soup.find_all("a"))
#print(soup.find_all("title"))
"""
查找一条p标签记录,print(soup.p)
"""
#4、查p标签下属性class的value值
#print(soup.p["class"])
#5、查找所有id="XXX"的标签及标签内容
#print(soup.find_all(id="link3"))
#6、从文档中找到所有<a>标签的链接
"""
for key in soup.find_all("a"):
print(key.get("href"))
"""
#7、从文档中获取所有的文字内容
#print(soup.get_text())
#8、探索标签数据类型
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>',"html.parser")
tag = soup.b
#print(type(tag)) #<class 'bs4.element.Tag'>
#9、获取标签名字,每个tag都有自己的名字,通过.name来获取
#print(soup.b.name)
#10、操作标签属性
#一个tag可能有很多个属性.
# tag <b class="boldest"> 有一个 “class” 的属性,值为 “boldest” . tag的属性的操作方法与字典相同
#print(soup.b["class"])
#11、执行删除标签属性等操作
#del tag['class']
#12、正则表达式
#面例子中找出所有以b开头的标签,这表示<body>和<b>标签都应该被找到
"""
import re
soup = BeautifulSoup(html_doc,"html.parser")
for tag in soup.find_all(re.compile("^b")):
print(tag.name)
"""
import re
soup = BeautifulSoup(html_doc,"html.parser")
#print(soup.find_all(href=re.compile("tillie"))) #href中包含tillie的超链接
#13、列表形式的匹配(匹配a和p标签)
soup = BeautifulSoup(html_doc,"html.parser")
#print(soup.find_all(["a","p"]))
#14、查找a标签下id="XXX"的标签及标签内容
# find_all( name , attrs , recursive , text , **kwargs )
# find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件.这里有几个例子:
#print(soup.find_all("a",id="link3"))
#15、查找a标签下class_="sister"的内容
#print(soup.find_all("a",class_="sister"))
#16、通过text参数可以搜文档中的字符串内容.
#与name参数的可选值一样, text参数接受字符串,正则表达式,列表,True
#print(soup.find_all(text="Elsie"))
#print(soup.find_all(text=["Tillie", "Elsie", "Lacie"]))
#17、限定查找标签的数量
#print(soup.find_all("a",limit=2))
#18、想搜索tag的直接子节点,可以使用参数 recursive=False
doc="""<html>
<head>
<title>The Dormouse's story</title>
</head>
</html>
"""
soup = BeautifulSoup(doc,"html.parser")
#print(soup.find_all("title",recursive=False))
#19、查找父节点,兄弟节点等办法(待研究)
#20、查找title标签
soup = BeautifulSoup(html_doc,"html.parser")
#print(soup.select("title"))
#21、找到某个tag标签下的直接子标签
#注意事项:p和b之前要空格,此写法"p>b"错误
#print(soup.select("p > b"))#查找p标签下的直接子标签b
#print(soup.select("body > b"))
#22、通过CSS的类名查找class="sister"的标签
result=soup.select(".sister")
#print(result)
#23、通过tag的id查找,soup.select("#link1")
result=soup.select("#link1")
#print(result)#[<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]