Beautiful Soup -- 文档笔记(一)

来源:互联网 发布:开通淘宝店铺流程 编辑:程序博客网 时间:2024/06/05 20:59

下面例子假设soup为BeautifulSoup对象
用途:可以从HTML或XML文件中提取数据的Python库
* 将HTML文档按标准格式输出:soup.prettify()
* 将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象
* Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment
* 不要轻易修改tag的name, 如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档
* tag的属性操作方法与字典一样
* 在Beautiful Soup中多值属性的返回类型是list
* tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用 replace_with() 方法
* 一个字符串不能包含其它内容(tag能够包含字符串或是其它tag),字符串不支持 .contents 或 .string 属性或 find() 方法.
* 如果想在Beautiful Soup之外使用 NavigableString 对象,需要调用 unicode() 方法,将该对象转换成普通的Unicode字符串,否则就算Beautiful Soup已方法已经执行结束,该对象的输出也会带有对象的引用地址.这样会浪费内存.
* 因为 BeautifulSoup 对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性.但有时查看它的 .name 属性是很方便的,所以 BeautifulSoup 对象包含了一个值为 “[document]” 的特殊属性 .name

soup.name输出: u'[document]'

子节点

  • 一个tag对象可能包含字符串和其他tag, 这些都是tag的子节点注意字符串也是子节点, 并且不能调用方法
  • 可以直接用soup.head 来获得head节点, 也可以在文档树的tag中多次调用这个方法.下面的代码可以获取标签中的第一个标签。注意通过点属性只能获得第一个节点(如果有多个head节点, 只能获得第一个):
soup.body.b输出 <b>The Dormouse's story</b>
  • BeautifulSoup 对象本身一定会包含子节点,也就是说标签也是 BeautifulSoup 对象的子节点:
len(soup.contents)输出 1soup.contents[0].name输出 u'html'
  • 一个tag中如果包含 NavigableString类型 子节点, 那么可以使用tag.string来获得子节点。但是如果包含多个NavigableString类型字符串, 那么会输出None
title_tag.string输出 u'The Dormouse's story'
  • 如果tag中包含多个字符串,可以使用 .strings 来迭代获取, 如果字符串中包含很多空格或者换行, 可以使用.stripped_strings 来消除

父节点

  • 通过 .parent 属性来获取某个元素的父节点
  • 文档title的字符串也有父节点:标签
title_tag.string.parent输出 <title>The Dormouse's story</title>
  • 文档的顶层节点比如的父节点是 BeautifulSoup 对象:
html_tag = soup.htmltype(html_tag.parent)输出 <class 'bs4.BeautifulSoup'>
  • BeautifulSoup父节点是None

兄弟节点

  • 在文档树中,使用 .next_sibling 和 .previous_sibling 属性来查询兄弟节点:
sibling_soup.b.next_sibling输出 <c>text2</c>sibling_soup.c.previous_sibling输出 <b>text1</b>
  • 兄弟节点:有相同父节点的同级节点, 实际文档中的tag的 .next_sibling 和 .previous_sibling 属性通常是字符串或空白
  • 通过 .next_siblings 和 .previous_siblings 属性可以对当前节点的兄弟节点迭代输出

搜索文档树

  • 过滤器:正则表达式, 字符串
  • 使用find_all(True), 可以迭代输出所有标签
  • find()方法。