Beautiful Soup是一个Python库,用于从HTML和XML文件中提取数据。它与您喜欢的解析器一起工作,提供导航、搜索和修改解析树的惯用方法。它通常为程序员节省数小时或数天的工作。Beautiful Soup适用于Python 2.7及以上版本。It works better if lxml and/or html5lib is installed.
三方库官方文档查看:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
pip intsall bs4
3.代码示例:
代码Demo
# -*- coding:utf-8 -*-
#beautofusoup模块,其强悍之处在于能够快速定位文档元素
import os
from bs4 import BeautifulSoup
import bs4
html_str = '''
管理页面
.contain{
color: red;
font-size: 14px;
}
生命真谛!!
- 第一条
- 第二条
- 第三条
'''
html_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'input/demo.html')
print(html_path)
# 实例化bs4对象,需要制定解析方式为:lxml
def instantiation_bs4():
#方法一:可以将字符串实例化为bs4对象,其中bs4会自动补齐标签
htmlDom = BeautifulSoup(html_str, 'lxml') #
print(type(htmlDom))
#方法二:将file对象实例化bs4对象
with open(html_path, 'r', encoding='utf-8') as f:
htmlDom = BeautifulSoup(f, 'lxml')
print(type(htmlDom))
return htmlDom
#bs4 api 节点选择器
#节点有比较明显的两个属性:name和attrs
#方法描述:通过节点的名字和位置关系定位具体元素
#优点:便捷快速的定位元素,只管简单
#缺点:针对路径较深、需要精确定位的元素来讲,该方法太多粗浅,无法满足
def bs4_base_api_by_tag(dom):
#一、单节点:根据标签名字查找对应的元素
div_e = dom.div #从上到下,匹配第一个div元素
print('-------------------------------------------------------')
print(type(div_e)) #return
a_e = dom.div.a
print(a_e)
print(a_e.name) #节点名称
print(a_e.attrs) #获取节点属性
print(a_e.attrs['class']) #获取节点某个元素属性,如下简写
print(a_e['class']) #[] 表示获取某个元素的属性值
print(a_e.string) # 获取节点元素的文本内容
#二、多节点:针对整个DOM数节点
div_e_parent = dom.div.parent #返div节点的父节点
print(type(div_e_parent)) #
div_e_parents = dom.div.parents #返回div节点的所有祖先节点
print(div_e_parents) #
div_e_children = dom.div.children #返回div元素的直接子节点
print(div_e_children) #
div_e_contents = dom.div.contents #返回div元素的所有直接子节点, 方法同上,返回值类型不同
print(type(div_e_contents)) #
div_e_descendants = dom.div.descendants #返回div元素的所有子孙节点
print(type(div_e_descendants)) #
div_next_sibling = dom.div.next_sibling #返回div元素的下一个兄弟节点,注意换行符号&空白也算
print(type(div_next_sibling))#
div_next_siblings = dom.div.next_siblings #返回 div节点后的所有兄弟节点
print(div_next_siblings) #
div_previous_sibling = dom.previous_sibling #返回 div节点的前一个兄弟节点
print(div_previous_sibling)
div_previous_siblings = dom.previous_siblings #返回div节点的所有前面兄弟节点
print(div_previous_siblings) #
#三、特别强调一个方法:strings,获取节点的所有文本内容
div_all_text = dom.div.strings #return
print(div_all_text)
for text in div_all_text:
try: #这里解决 h5中乱码场景
print(text)
except Exception as e:
print('decode error 2')
pass
print('---------------------------------------------------------------------------')
# #二、获取元素文本内容
# #2.1 获取某个元素的文本内容
# a_text = dom.a.string
# print(a_text)
# #2.2 获取整个dom的文本
# all_text = dom.strings #return
# print(all_text)
# for text in all_text:
# try: #这里解决 h5中乱码场景
# print(text)
# except Exception as e:
# print('decode error 2')
# pass
#bs4 api 方法选择器:
#方法描述:通过find方法定位元素,
def bs4_base_api_by_func(dom):
#find( name , attrs , recursive , text , **kwargs )
#find_all( name , attrs , recursive , text , **kwargs )
# find_parents(name , attrs , recursive , text , **kwargs )
# find_parent(name , attrs , recursive , text , **kwargs )
# find_next_siblings(name , attrs , recursive , text , **kwargs )
# find_next_sibling(name , attrs , recursive , text , **kwargs )
# find_previous_siblings(name , attrs , recursive , text , **kwargs )
# find_previous_sibling(name , attrs , recursive , text , **kwargs )
# find_all_next(name , attrs , recursive , text , **kwargs )
# find_next(name , attrs , recursive , text , **kwargs )
# find_all_previous()和find_previous()
####以上所有方法使用方法是一样的,具体的含义,与借点选其中一个道理
#使用例子:xpath=//*[@id="html"]/body/div[2]/div[1]/div[2],class=sons下所有文本内容【诗词和出处一一对应】
# div_e = dom.find('div', attrs=['class':'sons',]))
div_e = dom.find('div', attrs={'class':'sons', 'style':'padding-bottom:12px;'})
print(type(div_e))
sons_divs = div_e.find_all('div', attrs={'class':'cont'})
for div in sons_divs:
a_poem = div.find('a') #匹配第一个 a
span = div.find('span')
a_book = a_poem.find_next_sibling('a') #下一个兄弟节点
a_poem_text = a_poem.string
span_text = span.string
a_book_text = a_book.string
print(a_poem_text+span_text+a_book_text)
#bs4 api CSS选择器
#方法描述:tag 或 BeautifulSoup 对象的 .select()方法中传入字符串参数,即可使用CSS选择器的语法找到tag:
def bs4_base_api_by_css(dom):
#css选择器:https://www.w3school.com.cn/cssref/css_selectors.asp
#dom.select('css选择器')
#CSS选择器简单表达式:.class #id [attribute=value]
print(type(dom.select('body div'))) # 返回body下的所有div元素
#应用,通过CSS选择器获取到古诗文与文章出处
#xpath =//*[@id="html"]/body/div[2]/div[1]/div[2] ; class=sons
f_div_e = dom.select('body>div>div.left>div.sons')
print(len(f_div_e))
son_divs_e = f_div_e[0].select('div')
for son in son_divs_e:
a_poem_e = son.select('a')#
span_e = son.select('span') #
# print(type(a_poem_e))
if len(a_poem_e) == 2:
print(a_poem_e[0].string+span_e[0].string+a_poem_e[1].string)
else:
continue
if __name__=="__main__":
dom = instantiation_bs4()
bs4_base_api_by_tag(dom)
bs4_base_api_by_func(dom)
bs4_base_api_by_css(dom)
HTML文件
总结名句大全_古诗文网 推荐名句
类型:类型作者
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。





