BeautifulSoup

简介:

BeautiflSoup是一个可以从html或者xml中提取数据的python库,Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,

每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment 

 

Tag:

属性1:Name  通过.name获取Tag的名字(可以修改该Tag的Name,但是会影响所有通过当前Beautiful Soup对象生成的HTML文档)。

属性2:Attributes  通过.attrs获取该Tag的所有属性(字典形式,可以增加、删除、修改属性)。

 

 NavigableString :

  字符串常被包含在tag内,通过.string可以获取NavigableString对象。

  通过unicode方法可以将NavigableString对象转换为unicode对象(unicode(tag.string))。

  tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用 replace_with() 方法:tag.string.replace_with("No")。

 

BeautifulSoup:

  BeautifulSoup 对象表示的是一个文档的全部内容。

 

Comment:

  <!-- Hey, buddy. Want to buy a used parser?-->。

遍历文档树:

  获取节点:

    soup.p:只能返回第一个p标签。

      soup.find_all('a'):以列表形式返回所有a标签。

  获取字符串:   

    .string:

      1:如果tag(不论有多少子孙节点)只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到字符串。

      2:如果一个tag仅有一个子节点,那么这个tag也可以使用 .string 方法,输出结果与当前唯 一 子节点的 .string 结果相同。

      3:如果tag包含了多个子节点,tag就无法确定 .string 方法应该调用哪个子节点的内容, .string 的输出结果是 None 。

    .strings:

      如果tag中包含多个字符串,可以使用 .strings 来循环获取:for string in tag.strings。

    注:通过.get_text()方法可以直接获得unicode字符串。

下行遍历(.contents、.children、.descendants

  获取子节点:

    tag的 .contents 属性可以将tag的子节点以列表的方式输出:body.contents(注:字符串没有 .contents 属性,因为字符串没有子节点)。

    通过tag的 .children 生成器,可以对tag的子节点进行循环:for child in body.children。

  获取子孙节点:

    通过tag的.descendants 属性可以对所有的子孙节点进行递归循环 :for child in body.descendants。

上行遍历(.parent、.parents)

  获取父节点:

    通过 .parent 属性来获取某个元素的父节点:tag.parent。

    通过元素的 .parents 属性可以递归得到元素的所有父辈节点:for  parent in tag.parents。

平行遍历(.next_sibling、.previou_sibling、.next_siblings、.previous_siblings)

    .next_sibling:返回下一个平行节点标签:tag.next_sibling。

    .previous_sibling:返回上一个平行节点标签:tag.previous_sibling。

搜索文档树:

  find_all(name,attrs,recursive,text,**kwargs)

    name:参数值可以是字符串(标签名)、列表(包含多个标签)、正则表达式(tag.find_all(re.compile('b')),所有以b开头的标签)、True(该标签下的所有标签)。

    attrs:如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索。

        1:tag.find_all(id="link2")

        2:tag.find_all(href=re.compile("elsie"))

        3:tag.find_all(id=True)

        4:tag.find_all(href=re.compile("elsie"), id='link1')

        5:tag.find_all(attrs={"data-foo": "value"})

    recursive:调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False。

    text:通过 text 参数可以搜索文档中的字符串内容.与 name 参数的可选值一样。

    limit:限制find_all()返回结果的数量。

 

posted @ 2017-09-10 15:26  编程灬世界  阅读(213)  评论(0编辑  收藏  举报