likes
comments
collection
share

python爬虫之BeautifulSoup使用教程Beautiful Soup是一个强大的Python库,能够高效的从

作者站长头像
站长
· 阅读数 55

BeautifulSoup

1. 创建对象

from bs4 import BeautifulSoup
bs = BeautifulSoup(open('index.html', 'r', encoding='utf-8'), 'lxml')

2. 对象的种类

  • Tag,返回整个标签,如果存在多个,默认返回第一个
print(bs.meta)
# 输出结果
# <meta charset="utf-8" name="meta"/>
  • Attributes。获取标签属性值。直接查找结果后方括号。文本内容直接.text即可
print(bs.find('p')['id'])
print(bs.find('p')['style'])
print(bs.find('p')['class'])

3. 遍历文档树

  • 获取指定标签,直接通过标签名获取
print(bs.h1)
# <h1>Beautiful Soup</h1>
  • attrs属性,获取标签的所有属性,并以字典形式返回。
print(bs.h1.attrs)
# 输出结果
{'style': 'color:red;', 'id': 'title'}
  • contents属性,标签子节点。以列表形式返回我们通过find()查找到的标签的子节点
print(bs.find('ul').contents)
# 输出结果 ,包含换行符
# ['\n        test content\n        ', <li class="first">Tag</li>, '\n', <li class="second">NavigableString<span>important</span></li>, '\n', <li>BeautifulSoup</li>, '\n', <li>Comment</li>, '\n']

  • childrens属性,标签子节点。以生成器的形式返回当前标签的所有子节点,
tag = bs.find('ul')
it = tag.children
for i in it:
    print(i)
# 输出结果,同样也包含换行符

 #       test content
        
# <li class="first">Tag</li>


# <li class="second">NavigableString<span>important</span></li>


# <li>BeautifulSoup</li>


# <li>Comment</li>



  • descendants(后代)属性。同childrens属性,同样以生成器形式返回当前标签的所有后代节点(子节点和孙子节点)
  • parent属性。查找当前标签的父节点,并返回整个父标签
tag = bs.find('li',class_="first")
print(tag.parent)
# 输出结果
# <ul class="mainlist list">
#        test content
#        <li class="first">Tag</li>
# <li class="second">NavigableString<span>important</span></li>
# <li>BeautifulSoup</li>
# <li>Comment</li>
# </ul>

  • string属性,返回当前标签(节点)的子节点内容,即文本内容。如果该标签存在多个子节点,则返回none。
tag = bs.find('h1')
print(tag.string)
# 输入结果 BeautifulSoup
  • strings属性,标签存在多个子节点时使用,结果以生成器形式返回。
  • stripped_strings属性,输出字符串包含很多空格或空行,使用该属性可以去除空白内容。
  • .next_sibling 和 .previous_sibling。分别获取当前Tag的下一个和上一个兄弟节点。
  • .next_siblings 和 .previous_siblings。分别获取当前Tag后面和前面所有的兄弟节点,返回一个生成器。
  • .next_element 和 .previous_element
  • .next_elements 和 .previous_elements 返回生成器

总结 :获取标签文本的方法

# 第一种。.string
bs.find('li').string
# 第二种。.text
bs.find('li').text
# 第三种。get_text()
bs.find('li').get_text()

4. 搜索文档树 (1)find_all()过滤器。它能够接收很多种类型的参数,并返回一个列表。

  • 字符串。直接传入标签名称
bs.find_all('li')
# 输出结果
# [<li class="first">Tag</li>, <li class="second">NavigableString<span>important</span></li>, <li>BeautifulSoup</li>, <li>Comment</li>]
  • 列表。查找文档中出现的所有列表中的元素。
bs.find_all(['li','div']) 
# 输出结果
# [<li class="first">Tag</li>, <li class="second">NavigableString<span>important</span></li>, <li>BeautifulSoup</li>, <li>Comment</li>, <div><!--注释内容--></div>]
  • True。返回除字符串节点外的所有节点。
  • name参数,name即指标签名。
print(bs.find_all('h1'))
# 输出结果
# [<li class="first">Tag</li>, <li class="second">NavigableString<span>important</span></li>, <li>BeautifulSoup</li>, <li>Comment</li>]
  • keyword参数。
print(bs.find_all(class_="first")) # 查找类名为first的节点,由于class是python中的关键字,所以在其右侧加下划线以示区分。
# 输出结果
# [<li class="first">Tag</li>]
  • css搜索。
# 格式 bs.find_all(标签名,属性)
bs.find_all('li',class_="second")
  • limit参数,限制搜索结果数量
bs.find_all('li',limit=2)
  • recursive参数。find_all()默认会搜索当前节点的所有后代节点,通过设置recursive=False,使其只搜索当前节点的直接子节点。
bs.find_all('ul',recursive=False)

(2)find(),find()方法与find_all()类似,但只返回第一个符合要求的标签。 5. find_all()的简写方式

bs.find_all('li')
# 简写后
bs('li')

bs.ul.find_all('li')
# 简写后
bs.ul('li')

BeautifulSoup CSS样式取值

select(),括号里面写CSS选择器。只要CSS支持的选择器,在这里都适用。select()返回的是一个列表,即使满足条件的标签只有一个,也是以列表形式返回,所有在获取标签属性时要通过索引获取。

  • 获取属性值
# 第一种
bs.select('h1')[0]['id']
# 第二种
bs.select('h1')[0].get('id')
# 获取文本属性
bs.select('h1')[0].text
  • 查找属性
bs.select('a[href="javascript:;"]') # 查找href属性为 javascript:; 的a标签
bs.select('a[href*="javascript:;"]')# 查找href属性包含 javascript:; 的a标签
  • 类选择器(.)
bs.select('.first')
  • id选择器(#)
bs.select('#first')
  • 子选择器(>)
bs.select('.first>p')
  • 后代选择器(' '),空格。
bs.select('.first li')
  • 分组选择器(,),或的意思
bs.select('.first,.second')

select_one(),返回的就不是列表了,直接返回标签本身,后续获取属性就不需要再写索引了。如果查找不到,返回None。

转载自:https://juejin.cn/post/7401417746540494857
评论
请登录