用Beautiful Soup解析html源码

#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>]

 

posted @ 2016-04-03 17:49  Xiao|Deng  阅读(2037)  评论(0编辑  收藏  举报