栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python爬虫处理文档树【三方库—bs4】

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python爬虫处理文档树【三方库—bs4】

一、bs4是什么?

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/

二、使用步骤 1. bs4逻辑图

2. 三方库安装

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文件



	名句大全_古诗文网



    


    



      

推荐名句

下一页 上一页 / 5页
微信扫码登录 | 账号登录
总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/499222.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号