博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BeautifulSoup4入门
阅读量:5169 次
发布时间:2019-06-13

本文共 4716 字,大约阅读时间需要 15 分钟。

对象的种类

BeautifulSoup会将HTML文档抓换成一个树形结构, 每个节点都是Python对象,所有对象可以分为4类:Tag,NavigableString,BeautifulSoup,Comment

Tag

Tag与XML或HTML中的tag相同:

soup = BeautifulSoup('Extremely bold')tag = soup.bprint(type(tag))print(tag)--
--
Extremely bold

name

每一个Tag都有自己的name,可以通过.name。改变tag的name,将会影响通过当前BS对象生成的HTML文档

soup = BeautifulSoup('Extremely bold',"html.parser")tag = soup.bprint(tag)print(tag.name)tag.name="blockquote"print(tag)---Extremely bold---b---
Extremely bold

attributes

一个tag可能有多个属性

soup = BeautifulSoup('Extremely bold',"html.parser")tag = soup.bprint(tag['class'])print(tag.attrs)---['boldest']---{
'class': ['boldest']}

tag的属性可以被添加,删除或修改

soup = BeautifulSoup('Extremely bold',"html.parser")tag = soup.b#更改属性tag['class']="verybold"tag['id']=1print(tag)#删除属性del tag['class']print(tag)print(tag.get('class'))---Extremely bold---Extremely bold---
多值属性

多值属性即为可包含多个值的属性,最常见的即为class

xml中没有多值属性

多值属性的返回类型是list

css_soup = BeautifulSoup('

',"html.parser")print(css_soup.p['class'])---['body', 'strikeout']

若某个属性看起来像多值属性,但是在任何版本HTML中都没有被定义为多值属性,那么BS会将这个属性作为字符串返回

id_soup = BeautifulSoup('

',"html.parser")print(id_soup.p['id'])---my id

NavigableString不支持.content,.string,find()方法。

如果想在Beautiful Soup之外使用NavigableString对象,需要调用unicode()方法,将该对象转换成普通的Unicode字符串,否则就算Beautiful Soup已方法已经执行结束,该对象的输出也会带有对象的引用地址.这样会浪费内存.

soup = BeautifulSoup('Extremely bold',"html.parser")tag = soup.bprint(tag.string)print(type(tag.string))tag.string.replace_with("No long bold")print(tag)---Extremely bold---
---
No long bold

BeautifulSoup

BeautifulSoup对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法.

BeautifuSoup没有name和attribute属性。但有一个值为[document]的特殊属性.name

soup = BeautifulSoup('Extremely bold',"html.parser")print(soup.name)---[document]

Comment

遍历文档树

html_doc = """The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names wereElsie,Lacie andTillie;and they lived at the bottom of a well.

...

"""

.content.children

tag的.contents属性可以将tag的子节点以列表的方式输出:

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

print(soup.title.contents)print(soup.title.contents[0])---["The Dormouse's story"]---The Dormouse's story
for i in soup.head.children:    print(i)---The Dormouse's story

.descendants

.descendants属性可以对所有tag的子孙节点进行递归循环

print(soup.head.contents)for child in soup.head.descendants:    print(child)print(len(list(soup.children)))print(len(list(soup.descendants)))---[The Dormouse's story]---The Dormouse's story---The Dormouse's story---2---25

.string

如果tag只有一个NavigableString类型子节点,那么这个tag可以使用.string得到子节点

print(soup.head.string)---The Dormouse's story

.stringsstripped_strings

如果tag中有多个字符串,可以使用.strings循环获取

使用.stripped_strings可以去除多余空白内容:

for string in soup.stripped_strings:    print(repr(string))

.parent.parents

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

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

for parent in soup.a.parents:    if parent is None:        print(parent)    else:        print(parent.name)---p---html---[document]

兄弟节点

.next_sibling.previous_sibling

使用。next_sibling.previous_sibling属性来查询兄弟节点

实际文档中的tag的 .next_sibling 和 .previous_sibling 属性通常是字符串或空白。因为中间可能会隔着一些字符以及标点。

.next_siblings.previous_siblings

for sibling in soup.a.next_siblings:    print(repr(sibling))---',\n'---Lacie---' and\n'---Tillie';\nand they lived at the bottom of a well.'

重现解析过程

.next_element.previous_element

next_element属性指向解析过程中下一个被解析的对象(字符串或tag),结果可能与.next_sibling相同,但通常是不一样的.

last_a_tag=soup.find("a",id="link3")print(last_a_tag)print(last_a_tag.next_sibling)print(last_a_tag.next_element)---Tillie---;---and they lived at the bottom of a well.---Tillie

.next_elements.previous_elements

搜索文档树

过滤器

字符串

正则表达式

for tag in soup.find_all(re.compile("^b")):    print(tag.name)

列表

如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回.

True

True可以匹配任何值,但是不会返回字符串节点

方法

如果没有合适过滤器,那么还可以定义一个方法,方法只接受一个元素参数,如果这个方法返回True表示当前元素匹配并且被找到,如果不是则反回False。

def has_class_but_no_id(tag):    return tag.has_attr('class') and not tag.has_attr('id')

find_all()

name参数

keyword参数

soup.find_all(id='link2')

按CSS搜索

因为class是python保留字,所以用class_

例:
soup.find_all("a",class_="sister")

class_参数同样接受不同类型的过滤器 ,字符串,正则表达式,方法或 True :

tag的class属性是 多值属性 .按照CSS类名搜索tag时,可以分别搜索tag中的每个CSS类名:

text参数

通过text参数可以搜搜文档中的字符串内容.

limit参数

limit参数限制返回结果的数量

recursive参数

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

简写

soup.find_all("a")soup("a")
soup.title.find_all(text=True)soup.title(text=True)

find()

只返回一个结果

find_parents()find_parent()

find_next_siblings()和find_next_sibling()`

find_all_next()find_next()

find_all_previous()find_previous()

CSS选择器

在Tag或BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到tag:

转载于:https://www.cnblogs.com/fei-hsueh/p/6106285.html

你可能感兴趣的文章
Windows下PhpStorm结合WAMP开发Phalcon应用的配置
查看>>
921.Minimum Add to Make Parentheses Valid.
查看>>
JVM内存回收机制——哪些内存需要被回收(JVM学习系列2)
查看>>
执行SQL查询脚本
查看>>
java程序性能优化
查看>>
导航器的基本运用
查看>>
javascript中的类方法、构造方法、原型方法的对比
查看>>
HTML基础
查看>>
转:JMeter整合InfluxDB,Grafana让测试结果实时显示
查看>>
JavaScript实现生成GUID(全局统一标识符)
查看>>
一次微服务部署手册
查看>>
开源项目:MMTweenAnimation
查看>>
ES6学习之Symbol
查看>>
Bedrock Linux 0.7.3 发布
查看>>
html3
查看>>
iOS - Bluetooth 蓝牙
查看>>
POJ2749 Building roads
查看>>
查看sql语句执行时间/测试sql语句性能
查看>>
java利用正则截取字符串中的数字
查看>>
redis的安装与使用
查看>>