美文网首页
爬虫:页面解析 -- BeautifulSoup库的使用

爬虫:页面解析 -- BeautifulSoup库的使用

作者: 灯光树影 | 来源:发表于2018-09-10 12:25 被阅读0次

摘要

BeautifulSoup是一个用于解析html页面、xml文档等文件的python模块,它的使用非常简单,它的重点在于find和find_all方法的使用。不过它也存在着一定的劣势,查找速度比使用正则表达式和Xpath的速度要慢

说明

以下代码默认已导入bs4模块和BeautifulSoup类

    import bs4 
    from bs4 import BeautifulSoup

熬一碗美味汤

    soup = BeautifulSoup(html, "html.parser")

以上代码成功创建了一个soup对象,其中
html: 可以是html页面(dom元素)的字符串,如<p>This is a paragraph</p>
也可以是html文件,如open("index.html")。总的来说,html是html文件的内容
"html.parser": 这是一个html的解析器,其它可选择的解析器有"lxml"、"xml"、"html5lib"

BeautifulSoup的元素:

常用元素:
Tag: 标签,即html页面中一对标签组成的结点对象,
        获取方法为soup.tagName,其中tagName是标签名字,如soup.a表示获取html页面的a标签
Attribute: 标签属性,如<p class="statement"></p>的其中一个属性是class,
        获取属性列表的方法为Tag.attrs

不常用元素:
Name: 标签名字,如<p></p>的名字是p,获取方法为Tag.name
NavigableString: 标签文本,如<p>statement</p>的文本是statement,获取方法为tag.string
Comment: 注释,如≶p><p>的注释是comment,获取方法为tag.string

可以发现,NavigableString和Comment的获取方法相同,tag.string的类型通过以下规则区分:

  1. 如果tag中只有注释,那么返回类型为Comment;
  2. 如果tag中只有文本,那么返回类型为NavigableString;
  3. 如果tag中既含有注释,又有文本,那么返回类型为None;

为什么NavigableString是不常用的元素呢?
因为我们获取元素文本时,常常倾向于获取字符串,而NavigableString不是字符串类型。
我们通常使用tag.text来获取元素的文本字符串

获取相关标签结点的方法

常用:
以下“{}”表示或者的意思,如tag{soup}表示tag或者soup

  1. find和find_all函数
    功能:
    findAll(tag, attributes, recursive, text, limit, **keywords): 获取一个筛选后的标签
    find(tag, attributes, recursive, text, **keywords): 获取所有筛选后的标签组成的列表
    调用方式:
    tag{soup}.find(...)
    tag{soup}.find_all(...)
    其中,tag{soup}.find_all(...) 可以缩写成tag{soup}(...);...表示参数列表
    参数解释:
    tag: 字符串类型,通过标签类型查找, 如"a", "span"等
    attributes:字典类型,通过元素属性查找,如:findAll(attributes={"class":{"green", "red"}})表示查找class为green和red的元素
    recusive bool类型,True表示查找范围为所有后代元素;False表示查找范围只是子元素,默认为True
    text: 字符串类型,通过标签文本内容查找,如: findAll(text="I")表示查找文本含有I的元素
    limit:整型,只有findAll才有,限制查找元素的个数
    keywords: 字典类型,可以选择具有指定参数的元素,如:find(id="ele")表示查找id为ele的元素

  2. 获取儿子标签结点、子孙结点
    tag{soup}.children 迭代类型,儿子标签结点
    tag{soup}.descendants 迭代类型,子孙标签结点
    tag{soup}.contents 列表类型,儿子标签结点

不常用:

  1. 获取兄弟结点、父亲结点、祖先结点
    tag.previous_sibling: 标签类型,前一个兄弟结点
    tag.next_sibling: 标签类型,后一个兄弟结点
    tag.previous_siblings: 迭代类型,前面所有的兄弟结点
    tag.next_siblings: 迭代类型,后面所有的兄弟结点
    tag.parent: 标签类型,父亲结点
    tag.parents: 迭代类型,所有的祖先结点
  2. lambda表达式
    soup.findAll(lambda tag: len(tag.attrs)) 获取有两个属性的元素

以上知识基本上够用了,下面是遍历标签树的方法:

    # 下行遍历:
    # 遍历儿子结点
    for child in soup.body.children:
        print(child)
    # 遍历子孙结点
    for descendant in soup.body.descendants:
        print(descendant)
    
    # 上行遍历
    # 遍历
    for parent in soup.a.parents:
        if parent is None:
            print(parent)
        else:
            print(parent.name)
    
    # 平行遍历
    # 平行遍历发生在同一个父节点下 # 包括空结点
    # 遍历后序结点:
    for sibling in soup.a.next_siblings:
        print(sibling)
    # 遍历前序结点:
    for sibling in soup.a.previous_siblings:
        print(sibling)  

相关文章

网友评论

      本文标题:爬虫:页面解析 -- BeautifulSoup库的使用

      本文链接:https://www.haomeiwen.com/subject/jpcsgftx.html