zoukankan      html  css  js  c++  java
  • 爬虫——bs4模块

    bs4——解析文档数据

    安装

    pip3 install beautifulsoup4  # 解析html和xml,修改html和xml
    
    import requests
    from bs4 import BeautifulSoup
    
    # 文档容错能力,不是一个标准的html也能解析
    soup=BeautifulSoup(html_doc,'lxml')
    print(soup.prettify())
    
    # bs4的修改文档树  软件配置文件是xml格式的
    # 软件的配置文件
    # ini:configparser
    # conf
    # xml:bs4
    # yaml格式
    

    遍历文档树

    # 遍历文档树:即直接通过标签名字选择,特点是选择速度快,但如果存在多个相同的标签则只返回第一个
    head=soup.head
    p=soup.body.p
    print(head.name)
    

    嵌套选择

    a=soup.body.a
    

    css选择

    ret=soup.select('#my_p')
    ret=soup.select('body p')  # 子子孙孙
    ret=soup.select('body>p')  # 直接子节点(儿子)
    ret=soup.select('body>p')[0].text  # 直接子节点(儿子)
    

    搜索文档树

    find()  # 只返回找到的第一个
    find_all() # 找到的所有
    

    查看标签属性

    # class属性有一个也放到列表中
    print(p.attrs)
    print(p.attrs.get('class'))
    print(p['class'])
    print(p.get('class'))
    

    获取标签内容

    print(p.text)    # text会取该标签,子子孙孙的内容,拼到一起
    print(p.string)# # p下的文本只有一个时,取到,否则为None
    print(p.strings)#  生成器
    

    五种过滤器

    五种过滤器: 字符串、正则表达式、列表、True、方法
    
    # 字符串过滤,过滤内容是字符串
    a=soup.find(name='a')
    res=soup.find(id='my_p')
    res=soup.find(class_='story')
    res=soup.find(href='http://example.com/elsie')
    res=soup.find(attrs={'id':'my_p'})
    
    # 正则表达式
    import re
    re_b=re.compile('^b')
    res=soup.find(name=re_b)
    res=soup.find_all(name=re_b)
    res=soup.find_all(id=re.compile('^l'))
    
    # 列表
    res=soup.find_all(name=['body','b'])
    res=soup.find_all(class_=['sister','title'])
    
    # True和false
    res=soup.find_all(name=True)
    
    # 方法(了解)
    def has_class_but_no_id(tag):
        return tag.has_attr('class') and not tag.has_attr('id')
    
    print(soup.find_all(has_class_but_no_id))
    

    limit 和 recursive

    limit(限制查找的条数)
    res=soup.find_all(name=True,limit=1)
    recursive(recursive递归查找,找子子孙孙)
    res=soup.body.find_all(name='b',recursive=True)
    

    子节点,子孙节点,父节点,兄弟节点

    子节点、子孙节点
    # print(soup.p.contents) #p下所有子节点
    # print(soup.p.children) #得到一个迭代器,包含p下所有子节点
    # print(list(soup.p.children)) #得到一个迭代器,包含p下所有子节点
    父节点、祖先节点
    # print(soup.a.parent) #获取a标签的父节点(只有一个)
    # print(soup.p.parent) #获取p标签的父节点
    # print(soup.a.parents) #找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...
    # print(list(soup.a.parents))#找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...
    # print(len(list(soup.a.parents)))#找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...
    兄弟节点
    # print(soup.a.next_sibling) #下一个兄弟
    # print(soup.a.previous_sibling) #上一个兄弟
    # print(list(soup.a.next_siblings)) #下面的兄弟们=>生成器对象
    # print(list(soup.a.previous_siblings)) #上面的兄弟们=>生成器对象
    
  • 相关阅读:
    在RedHat As5 下开放默认的防火墙指定端口
    今看假钞横流有感,给手机开发商建议
    win2003系统自动登录两法
    Adobe 最新的几个连接Dreamweaver cs4
    eXtremeComponents安装配置
    nvidiadocker
    你看这颗咖啡豆。”她纤细的手指拈起一枚褐色的豆子
    好郁闷啊
    超强:终于知道移动比联通牛的原因了!
    人人
  • 原文地址:https://www.cnblogs.com/pythonwl/p/13433187.html
Copyright © 2011-2022 走看看