Beautiful Soup是python的一个HTML或XML的解析库,可以用它来方便地从网页中提取数据
Beautiful Soup提供一些简单的,python式的函数来处理导航,搜索,修改分析数等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,不需要多少代码就可以写出一个完整的应用程序
Beautiful Soup自动将输入文档转换为unicode编码,输出文档转换为UTF-8编码。不需要考虑编码方式,除非文档没有指定一个编码方式,这时仅仅需要说明一下原始编码方式就可以
基本用法
节点选择器
直接调用节点的名称就可以选择节点元素,再调用 st ring 属性就可以得到节点内的文本了,这种选择方式速度非常快 如果单个节点结构层次非常清晰,可以选用这种方式来解析。
这里选择上面的html代码,打印输出title节点的选择结果,输出的内容为title的内容,输出soup.head类型,是bs4.element.Tag类型,它是beautifulsoup的一个重要的数据结构,经过选择器选择后,选择结果都是这种 Tag 类型 Tag 具有一些属性,比如 string
属性,调用该属性,可以得到节点的文本内容,所以接下来的输出结果正是节点的文本内容
name是用来获取节点的名称
attrs用来获取节点的属性,可能是多个,他把选择的节点的所有属性和属性值组合成一个字典。,如果想要获取某个键值,只需要用中括号加属性名就可以,比如,想要获取name属性,可以通过attrs['name']来得到
更加简单的一种方法是,直接在节点元素后面加上中括号,传入属性名就可以获取属性值,例如:soup.p['name']
注意:有的返回结果是字符串,有的是字符串组成的列表,当属性值唯一的时候,返回的是字符串,多个值的时候返回的是列表
获取内容,可以利用string属性获取节点元素包含的文本内容。
例如:获取第一个p节点的文本,soup.p.string
嵌套选择:soup.head.title.string 获取head节点下的title节点的内容
关联选择
再做选择的时候,有时候不能做到一补就选到想要的节点元素,需要先选中某一个节点元素,然后以它为基准在选择他的子节点,父节点,兄弟节点等
如果想要获取它的直接子节点,可以调用contents属性
parent可以获得父节点以及内部的内容
parents不仅获得父节点和内部的内容,还可以获取所有的祖先的内容
兄弟节点,就是获取同级的节点
next_sibling和previous_sibling分别获取节点的下一个和上一个兄弟元素
next_sibling和previous_sibling分别返回所有前面和后面的兄弟节点的生成器
提取信息,同前面的方法一样
如果获取到的是单个节点,可以直接调用string,attrs等属性获得文本和属性。如果返回的结果是多个节点的生成器,则可以转为列表后取出某个元素,然后再调用string,attrs等属性获取其对应节点的文本和属性
方法选择器
find_all可查找所有符合条件的元素,返回结果为列表类型,元素类型为bs4.element.Tag
根据节点名查询
可以使用嵌套进行查询其他节点
attrs,根据属性查询,这里使用attrs,传入的数据为字典形式,得到的结果是列表类型
当想要查询的属性为id和class的时候,还可以用如下的方法,注意,下面的class使用的使用要用class_,因为class是python中的一个关键字,所以需要后面需要加上下划线,如:class_="element"
text参数可用来匹配节点的文本,传入的可以是字符串,可能是正则表达式对象
这里得到的结果不是列表类型,而是Tag类型
另外还有许多查询方法,与find_all和find的方法完全相同,只不过范围不同
find_parents()和find_parent():前者返回所有祖先节点,后者返回直接父节点
find_next_siblings和find_next_sibling():前者返回后面所有的兄弟节点,后者返回后面第一个兄弟的节点
find_previous_siblings()和find_previous_sibling():前者返回前面所有的兄弟节点,后面返回前面第一个兄弟节点
find_all_next()和find_next():前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点
find_all_previous()和find_previous():前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点
CSS选择器
获取属性,直接传入中括号和属性名,或者直接输入attrs获取属性名
获取文本可使用get_text(),或者是前边的属性string
但是当出现以下情况的时候,结果不同,在里面循环,get_text()得到的结果是整个自身节点包括子节点的内容,string返回的是None