解析模块BeautifulSoup

"""
beautifulSoup模块的目的就是为简化解析,取代原始re匹配

"""
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<a><a id="bgon"></a></a>
<a></a><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>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>

"""

from bs4 import BeautifulSoup
import re


# 以文件的方式传入
# f = open("test.html","rt",encoding="utf-8")
# soup = BeautifulSoup(f,"lxml")

# 直接将字符串形式的文档内容传入
soup = BeautifulSoup(html_doc,"lxml")
# res = soup.prettify() # 格式化文档
# print(res)

# 遍历文档
# 通过点的方式来获取需要的内容
# print(soup.a) # 获取第一个a标签

# print(soup.a.name) # 标签名
# print(soup.a.text) # 文本
# print(soup.a.attrs) # 获取属性字典
#
# # 嵌套获取
# print(soup.body.p.b)

# 获取这个标签自己的文本
# print(soup.html.text)
# print(soup.html.string)
# # 获取这个标签包含所有文本 一个生成器
# print(list(soup.html.strings))
# 获取这个标签包含所有文本 一个生成器 # 自动去除空白字符
# print(list(soup.stripped_strings))

# 子标签
# print(soup.html.contents) # 返回列表
# print(list(soup.html.children)) # 返回迭代器


# 所有后代标签
# print(list(soup.html.descendants))# 返回生成器


# 获取相邻的元素
# print(soup.p.next_sibling)
# print(soup.p.previous_sibling)

# 获取父级
# print(soup.body.parent)




# 搜索文档内容

# 五种搜索方式
# 1.基于字符串
# print(soup.find_all("a")) # 所有a标签

# 2.基于列表
# print(soup.find_all(["a","b"])) # 所有a和b标签

# 3,True
# print(soup.find_all(True)) # 所有标签

# 4.基于正则表达式
# print(soup.find_all(re.compile("^a"))) # 所有a标签


# def class_and_id(tag):
# if tag.has_attr("class") and tag.has_attr("id"):
# return True
# 5.基于函数 当上述几种方式无法满足需求时可以自定函数
# print(soup.find_all(class_and_id)) # 所有a标签
# print(soup.find_all(lambda tag: True if tag.has_attr("class") and tag.has_attr("id") else False)) # 所有a标签

# soup.find()


# find_all参数详解
# 通过标签名
# print(soup.find_all(name=re.compile("^b")))

# print(soup.find_all(attrs={"class":re.compile("si")}))

# print(soup.find_all(text=re.compile("The")))

# 递归的意思是 把整个文档都搜索一遍 无论你在那一层
# print(soup.body.find_all("a",recursive=False)) #

# print(soup.find_all("a",limit=2)) #

# 只找第一个
# print(soup.find("a"))

# 多余关键字参数 会当做属性去查找
print(soup.find_all("a",class_="sister"))

# 使用CSS选择前来查找元素
print(soup.select(".sister"))

# #10
# .sister




















posted @ 2019-01-23 19:27  不沉之月  阅读(124)  评论(0编辑  收藏  举报