zoukankan      html  css  js  c++  java
  • python处理网页内容的第三方包-BeautifulSoup

    解析html文件,xml文件的工具

    解析,维护,遍历标签‘树’的功能库

    (1)引入:

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup('a.html', 'html.parser')

    其中第二个入参为解析器,目前有四种

    1.bs4的html解析器:‘html.parser’

    2.lxml的html解析器:‘lxml’  (pip install lxml)

    3.lxml的xml解析器:‘xml’ (pip install lxml)

    4.html5lib的解析器:‘html5lib’ (pip install html5lib)

    (2)基本元素

    Tag  标签,最基本的信息组织单元,分别用<> </>标明开头和结尾,BeautifulSoup.tag

    Name 标签的名字,<p>.....</p>的名字是'p',格式<tag>.name

    Attributes 标签的属性,字典形式组织,格式 <tag>.attrs

    NavigableString 标签内非属性字符串,<>...</>中字符串,格式<tag>.string

    Comment 标签内字符串的注释部分,一种特殊的Comment类型 <tag>.string

    (3)html的遍历

    • 标签树的下行遍历
    1.  .contents 子节点的列表,将<tag>的所有儿子节点存入列表
    2.  .children 子节点的迭代类型,与.contents类似,用于遍历儿子节点
    3. .descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历
      #遍历儿子节点
      for child in soup.body.children:
          print(child)
      
      #遍历子孙节点
      for child in soup.body.descendants:
          print(child)
    • 标签树的上行遍历
    1.  .parent 节点的父亲标签
    2.  .parents 节点先辈标签的迭代类型,用于循环遍历先辈节点
    • 标签树的平行遍历(发生在同一父节点的各节点间)
      1.  .next_sibling 返回按照HTML文本顺序的下一个平行节点标签
      2.  .previous_sibling 返回按照HTML文本顺序的上一个平行节点的标签
      3.  .next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点的标签
      4.  .previous_siblings 迭代类型,返回按照HTML文本顺序的前序所有平行节点的标签
        #遍历后续节点
        for sibling in soup.a.next_siblings:
            print(sibling)
        #遍历前序节点
        for sibling in soup.a.previous_siblings:
            print(sibling)

     (4) soup.pretiffy()美化html

    (5)find_all 代码

     1 def filter_rule():
     2     # rule地址
     3     url = 'http://xxxxx/rul'
     4 
     5     try:
     6         response = requests.get(url)
     7         response.raise_for_status()
     8     except Exception as e:
     9         print("获取时发生错误")
    10         raise e
    11 
    12     soup = BeautifulSoup(response.text, 'html.parser')
    13     for tr in soup.find_all('td', {'class':'rule_cell'}):
    14         rule = tr.contents[3].contents[0]
    15         rule = rule.replace('
    ','')
    16         rule = rule.replace('	', '')
           print(rule)

     soup.find_all(name, attrs, recursive, string, *kwargs)

    soup() soup.tag() 都等同于find_all()

    返回列表类型

    name:表示标签名, True可返回所有标签名称

    attrs: 属性字符串

    recursive:深度遍历 false 不对子孙检索; 默认为True

    string: <> .... </> 字符创区域进行检索字符串

    当需要检索更多内容时,可使用正则表达式库

    import re
    
    #将html中带有 python 字符串的内容全部输出,列表类型
    soup.find_all(string = re.compile('python'))
  • 相关阅读:
    加强面向对象设计思想需要学习的知识
    (转载)myeclipse快捷键
    tomcat的jdbc驱动
    mysql常见设置
    不用配制数据源如何用JDBC连接access数据库
    关于updatePanel
    jsp常见问题
    Servlet问题
    Rational Rose未找到suite objects.dll问题
    jsp+servlet+javabean实现简单的查询
  • 原文地址:https://www.cnblogs.com/yiyi8/p/12605371.html
Copyright © 2011-2022 走看看