BeautifulSoup基本用法总结

2 篇文章 0 订阅
1 篇文章 0 订阅

BeautifulSoup是Python的一个库,最主要的功能就是从网页爬取我们需要的数据。BeautifulSoup将html解析为对象进行处理,全部页面转变为字典或者数组,相对于正则表达式的方式,可以大大简化处理过程。

0x01 安装

建议安装BeautifulSoup 4版本 利用pip进行安装:

pip install beautifulsoup4

BeautifulSoup默认支持Python的标准HTML解析库,但是它也支持一些第三方的解析库:

序号解析库使用方法优势劣势
1Python标准库BeautifulSoup(html,’html.parser’)Python内置标准库;执行速度快容错能力较差
2lxml HTML解析库BeautifulSoup(html,’lxml’)速度快;容错能力强需要安装,需要C语言库
3lxml XML解析库BeautifulSoup(html,[‘lxml’,’xml’])速度快;容错能力强;支持XML格式需要C语言库
4htm5lib解析库BeautifulSoup(html,’htm5llib’)以浏览器方式解析,最好的容错性速度慢

0x02 创建对象

导入库:

from bs4 import BeautifulSoup

创建实例:

url='http://www.baidu.com'
resp=urllib2.urlopen(url)
html=resp.read()

创建对象:


bs=BeautifulSoup(html)

格式化输出内容:

print bs.prettify()

0x03 对象种类

BeautifulSoup将复杂的html文档转换为树形结构,每一个节点都是一个对象,这些对象可以归纳为几种:

(1)Tag

Tag相当于html种的一个标签:

#提取Tag
print bs.title
print type(bs.title)

结果:

<title>百度一下,你就知道</title>
<class 'bs4.element.Tag'>

对于Tag,有几个重要的属性:

name:每个Tag对象的name就是标签本省的名称;
attrs:每个Tag对象的attrs就是一个字典,包含了标签的全部属性。

print bs.a.name
print bs.a.attrs

输出:

a
{u'href': u'/', u'id': u'result_logo', u'onmousedown': u"return c({'fm':'tab','tab':'logo'})"}

(2)NavigableString

Comment是一种特殊的NavigableString,对应的是注释的内容,但是其输出不包含注释符。看这样的一个例子:

#coding:utf-8

from bs4 import BeautifulSoup

html='''
<a class="css" href="http://example.com/test" id="test"><!--test --></a>
'''
bs=BeautifulSoup(html,"html.parser")
print bs.a
print bs.a.string

运行结果:

<a class="css" href="http://example.com/test" id="test"><!--def --></a>

a标签的内容是注释,但是使用.string仍然输出了。这种情况下,我们需要做下判断:

#判断是否是注释
if type(bs.a.string)==element.Comment:
    print bs.a.string

再看下面的例子:

<a class="css1" href="http://example.com/cdd" id="css">abc<!--def -->gh</a>

内容是注释和字符串混合,此时可以用contents获取全部对象:

for i in bs.a.contents:
    print i

如果需要忽略注释内容的话,可以利用get_text()或者.text:

print bs.a.get_text()

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

0x04 搜索文档树

重点介绍下find_all()方法:

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

(1)name参数

name参数可以查找所有名字为name的Tag,字符串对象自动忽略掉。

print bs.find_all('a')

传列表:

print bs.find_all(['a','b'])

传入正则表达式:

print bs.find_all(re.compile('^b'))

所有以b开头的标签对象都会被找到。
传递方法:

def has_class_but_not_id(tag):
    return tag.has_attr('class') and not tag.has_attr('id')
print bs.find_all(has_class_but_not_id)

(2)kwyowrds关键字

print bs.find_all(id='css')
print bs.find_all(id=re.compile('^a'))

还可以混合使用:

print bs.find_all(id='css',href=re.compile('^ex'))

可以使用class作为过滤,但是class是Python中的关键字,可以使用class_代替,或者采用字典的形式传输参数:

print bs.find_all(class_='css')
print bs.find_all(attrs={'class':'css'})

(3)text参数

用来搜索文档中的字符串内容,text参数也接收字符串、正则表达式、列表、True等参数。

print bs.find_all(text=re.compile('^abc'))

(4)limit参数

限制返回对象的个数,与数据库SQL查询类似。

(5)recursive参数

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

0x05 CSS选择器

可以采用CSS的语法格式来筛选元素:

#标签选择器
print bs.select('a')
#类名选择器
print bs.select('.css')
#id选择器
print bs.select('#css')
#属性选择器
print bs.select('a[class="css"]')
#遍历
for tag in bs.select('a'):
    print tag.get_text()

对于喜欢用CSS语法的人来说,这种方式非常方便。如果你仅仅需要CSS选择器的功能,那么直接使用 lxml 也可以,而且速度更快,支持更多的CSS选择器语法,但Beautiful Soup整合了CSS选择器的语法和自身方便使用API。

  • 24
    点赞
  • 168
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python Beautiful Soup 的 find() 方法是用于在 HTML 或 XML 文档中查找指定标签的方法。它可以根据标签名、属性、文本内容等多种方式进行查找,并返回第一个匹配的标签对象。使用该方法可以方便地提取网页中的数据,进行数据分析和处理。 ### 回答2: BeautifulSoup提供了非常便捷的方法来搜索HTML文档中的元素。其中一个主要的方法是find()。find()方法用于查找符合指定条件的第一个元素。 find(name, attrs, recursive, string, **kwargs)方法的参数含义如下: - name:表示要查找的元素的标签名。可以直接传入标签名的字符串,也可以使用正则表达式来匹配标签名。 - attrs:表示要查找的元素的属性。可以是一个字典,也可以是一个关键字参数。字典的键是属性名,值是属性值。关键字参数的格式是name=value的形式。 - recursive:表示是否要递归地查找所有的子孙元素。默认值是True。 - string:表示要查找的元素的文本内容。可以直接传入字符串,也可以使用正则表达式来匹配文本内容。 - **kwargs:表示其他的限定条件,例如class_、id等。 find()的返回值是满足查找条件的第一个元素,如果找不到则返回None。 下面是一个简单的示例代码: ``` html = ''' <html> <head> <title>Hello World</title> </head> <body> <div class="container"> <h1>Hello World</h1> <p>This is a beautiful world.</p> </div> </body> </html> ''' from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'html.parser') div = soup.find('div', class_='container') # 查找class属性为container的div元素 h1 = div.find('h1') # 在div元素中查找h1元素 print(h1.text) # 输出:Hello World ``` 以上代码首先创建了一个HTML文档的字符串,然后使用BeautifulSoup解析了该字符串。接着使用find()方法查找class属性为container的div元素,然后在该div元素中使用find()方法查找h1元素。最后输出了h1元素的文本内容。 总之,find()方法是BeautifulSoup中非常常用的一个方法,可以方便地根据需要查找HTML文档中的特定元素。 ### 回答3: BeautifulSoupPython中一个用于解析HTML和XML文档的库。其中的find方法是BeautifulSoup对象的一个方法,用于在HTML文档中根据指定的标签名、属性名和属性值来查找匹配的元素。 find方法的基本用法是:soup.find(name, attrs, recursive, text, **kwargs),其中name表示要查找的标签名,attrs表示要查找的元素的属性,recursive表示是否递归地查找所有后代元素,默认为True,text表示要查找的元素的文本内容,**kwargs为其他属性缩写形式。 例如,假设我们有一个HTML文档如下: ``` <html> <head> <title>BeautifulSoup Find Example</title> </head> <body> <div class="container"> <h1>标题</h1> <p class="content">这是内容</p> </div> </body> </html> ``` 我们可以使用BeautifulSoup库来解析该HTML文档,并使用find方法来查找匹配的元素,如下所示: ```python from bs4 import BeautifulSoup # 解析HTML文档 html = ''' <html> <head> <title>BeautifulSoup Find Example</title> </head> <body> <div class="container"> <h1>标题</h1> <p class="content">这是内容</p> </div> </body> </html> ''' soup = BeautifulSoup(html, 'html.parser') # 根据标签名查找元素 h1 = soup.find('h1') print(h1.text) # 输出:标题 # 根据属性名和属性值查找元素 p = soup.find(attrs={'class': 'content'}) print(p.text) # 输出:这是内容 ``` 以上代码中,我们首先使用BeautifulSoup库将HTML文档解析成BeautifulSoup对象。然后,通过调用find方法,通过标签名查找到匹配的h1元素,并输出它的文本内容。接着,通过给find方法传递attrs参数,我们根据class属性值查找到匹配的p元素,并输出它的文本内容。 总结来说,BeautifulSoup的find方法提供了灵活的参数选择,可以根据标签名、属性名和属性值等来查找匹配的元素,方便我们对HTML文档进行数据提取和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值