博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BeautifulSoup相关的用法
阅读量:5081 次
发布时间:2019-06-12

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

from bs4 import BeautifulSouphtml = '''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.

...

'''soup = BeautifulSoup(html, "lxml")
print(soup.prettify()) print(soup.title) print(soup.title.name) print(soup.title.string) print(soup.title.parent.name) print(soup.p) print(soup.p["class"]) print(soup.a) print(soup.find_all('a')) print(soup.find(id='link3'))

上述为选择器的大体使用方法

 

基本使用标签选择器

print(soup.title)print(type(soup.title))print(soup.head)print(soup.p)

通过这种soup.标签名 我们就可以获得这个标签的内容这里有个问题需要注意,通过这种方式获取标签,如果文档中有多个这样的标签,返回的结果是第一个标签的内容,如上面我们通过soup.p获取p标签,而文档中有多个p标签,但是只返回了第一个p标签内容

获取名称

当我们通过soup.title.name的时候就可以获得该title标签的名称,即title

获取属性

print(soup.p.attrs['name'])print(soup.p['name'])

上面两种方式都可以获取p标签的name属性值

获取内容

print(soup.p.string)

 

结果就可以获取第一个p标签的内容:The Dormouse's story

 

嵌套选择

我们直接可以通过下面嵌套的方式获取

print(soup.head.title.string)

 

子节点和子孙节点

contents的使用
通过下面例子演示:

html = """            The Dormouse's story                

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

...

"""from bs4 import BeautifulSoupsoup = BeautifulSoup(html,'lxml')print(soup.p.contents)

 

children的使用

通过下面的方式也可以获取p标签下的所有子节点内容和通过contents获取的结果是一样的,
但是不同的地方是soup.p.children是一个迭代对象,而不是列表,只能通过循环的方式获取素有的信息

print(soup.p.children)for i,child in enumerate(soup.p.children):    print(i,child)

 

通过contents以及children都是获取子节点,如果想要获取子孙节点可以通过descendantsprint(soup.descendants)同时这种获取的结果也是一个迭代器

父节点和祖先节点

通过soup.a.parent就可以获取父节点的信息通过list(enumerate(soup.a.parents))可以获取祖先节点,这个方法返回的结果是一个列表,会分别将a标签的父节点的信息存放到列表中,以及父节点的父节点也放到列表中,并且最后还会讲整个文档放到列表中,所有列表的最后一个元素以及倒数第二个元素都是存的整个文档的信息

 

 

兄弟节点

soup.a.next_siblings 获取后面的兄弟节点
soup.a.previous_siblings 获取前面的兄弟节点
soup.a.next_sibling 获取下一个兄弟标签
souo.a.previous_sinbling 获取上一个兄弟标签

标准选择器

 

find_all(name,attrs,recursive,text,**kwargs
可以根据标签名,属性,内容查找文档

name的用法

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar
'''from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')# print(soup.find_all('ul')) # 返回的结果是一个列表# print("goal", soup.find_all('ul')[0])# print(type(soup.find_all('ul')[0])) #
for ul in soup.find_all('ul'): print(ul.find_all('li')) # 列表方式展现标签

 

attrs例子如下

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar
'''from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')print(soup.find_all(attrs={
'id': 'list-1'}))print(soup.find_all(attrs={
'name': 'elements'}))

 

attrs可以传入字典的方式来查找标签,但是这里有个特殊的就是class,因为class在python中是特殊的字段,所以如果想要查找class相关的可以更改attrs={'class_':'element'}或者soup.find_all('',{"class":"element}),特殊的标签属性可以不写attrs,例如id

 

text
例子如下:

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar
'''from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')print(soup.find_all(text='Foo')) # 结果返回的是查到的所有的text='Foo'的文本 结果['Foo', 'Foo']

 

find

find(name,attrs,recursive,text,**kwargs)
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选择器

 

通过select()直接传入CSS选择器就可以完成选择熟悉前端的人对CSS可能更加了解,其实用法也是一样的.表示class #表示id标签1,标签2 找到所有的标签1和标签2标签1 标签2 找到标签1内部的所有的标签2[attr] 可以通过这种方法找到具有某个属性的所有标签[atrr=value] 例子[target=_blank]表示查找所有target=_blank的标签

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar
'''from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')print(soup.select('.panel .panel-heading')) # 里面就是找.panel里面的.panel-heading 只显示最终目标的结果print(soup.select('ul li'))print(soup.select('#list-2 .element'))print(type(soup.select('ul')[0]))

 

获取内容

 

通过get_text()就可以获取文本内容

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar
'''from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')for li in soup.select('li'): print(li.get_text())

 

 

获取属性

或者属性的时候可以通过[属性名]或者attrs[属性名]

html='''

Hello

  • Foo
  • Bar
  • Jay
  • Foo
  • Bar
'''from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')for ul in soup.select('ul'): print(ul['id']) # 这两种方法相通都是获取id的 print(ul.attrs['id'])

 

总结

推荐使用lxml解析库,必要时使用html.parser
标签选择筛选功能弱但是速度快
建议使用find()、find_all() 查询匹配单个结果或者多个结果
如果对CSS选择器熟悉建议使用select()
记住常用的获取属性和文本值的方法

 
 

转载于:https://www.cnblogs.com/cjj-zyj/p/10044852.html

你可能感兴趣的文章
BZOJ 1834网络扩容题解
查看>>
bzoj1878
查看>>
【Vegas原创】Mysql绿色版安装方法
查看>>
Thrift Expected protocol id ffffff82 but got 0
查看>>
分享《去哪儿网》前端笔试题
查看>>
2013-07-04学习笔记二
查看>>
CP15 协处理器寄存器解读
查看>>
【codeforces 787B】Not Afraid
查看>>
【9111】高精度除法(高精度除高精度)
查看>>
【hihocoder 1312】搜索三·启发式搜索(普通广搜做法)
查看>>
JavaFX中ObservableValue类型
查看>>
杭电 1097 A hard puzzle
查看>>
[转载]INFORMIX锁机制及如何剖析其锁申辩(第二部门)
查看>>
Andriod-项目stymqjlb-学习笔记2-原型
查看>>
Web AppDomain
查看>>
JQuery创建规范插件
查看>>
AD 域服务简介(三)- Java 对 AD 域用户的增删改查操作
查看>>
Unity中Text渐变色,和Text间距
查看>>
P4932 浏览器
查看>>
Concurrency Kit 0.2.13 发布,并发工具包
查看>>