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('\n','')
16         rule = rule.replace('\t', '')
       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'))

 

posted @ 2020-03-31 15:11  君子依依  阅读(595)  评论(0编辑  收藏  举报