BeautifulSoup的用法

x33g5p2x  于2021-12-06 转载在 其他  
字(3.1k)|赞(0)|评价(0)|浏览(226)

BeautifulSoup的用法

beautifulSoup是一个灵活又方便的网页解析库,处理高效,支持多种解析器。利用它不用编写正则表达式即可方便地实现网页信息的提取。

安装

通过指令: pip install beautifulsoup4 或者在pycharm第三方库安装页面中搜索安装beautifulsoup4即可。

使用

解析库
解析器使用方法优势劣势
Python标准库BeautifulSoup(markup, ‘html.parser’)Python的内置标准库、执行速度适中、文档容错能力强低版本中文容错能力差
lxml HTML解析器BeautifulSoup(markup, ‘lxml’)速度快、文档容错能力强需要安装C语言库
lxml XML解析器BeautifulSoup(markup, ‘xml’)速度快、唯一支持xml的解析器需要安装C语言库
Html5libBeautifulSoup(markup, ‘html5lib’)最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档速度慢,不依赖外部扩展
基本使用
  • 创建解析器对象: BeautifulSoup(html文本内容, 解析器)
from bs4 import BeautifulSoup

html = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title" name="dromouse"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """
soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())
print(soup.title.string)
标签选择器
  • 解析器对象.标签名
# 获取title标签
print(soup.title)
print(type(soup.title))

# 获取 head 标签
print(soup.head)

# 获取 p 标签
print(soup.p)
获取名称
  • 标签对象.name
print(soup.title.name)    # 'title'
获取属性
  • 标签对象.attrs[属性名]
print(soup.a.attrs['href'])   # ’http://example.com/elsie‘
获取内容
  • 标签对象.string
  • 标签对象.get_text()
  • 内容:标签对象.contents
print(soup.p.string)    # The Dormouse's story
嵌套选择
  • 解析器对象.标签1.标签2
print(soup.head.title.string)
子节点和子孙节点
  • 子节点:标签对象.children
  • 子孙节点:标签对象.descendants
print(soup.p.contents)

for x in soup.div.children:
    print('x:', x)
    
for x in soup.div.descendants:
    print('x:', x)
父节点和祖先节点
  • 父节点:标签对象.parent
  • 祖先节点:标签对象.parents
print(soup.span.parent)

for x in soup.span.parents:
    print('x:', x)
兄弟节点
  • 标签对象.next_siblings
  • 标签对象.previous_siblings
print(list(enumerate(soup.a.next_siblings)))
print(list(enumerate(soup.a.previous_siblings)))
标准选择器
  • 根据标签名查找标签:解析器对象/标签对象.find_all(标签名)
  • 根据指定属性值查找标签: 解析器对象/标签对象.find_all(attrs={属性名: 属性值})
  • 根据标签内容查找:解析器对象/标签对象.find_all(text=内容)

find_all表示查找所有,把它改成find表示查找单个

print(soup.find_all('ul'))
print(type(soup.find_all('ul')[0]))
for ul in soup.find_all('ul'):
    print(ul.find_all('li'))
    
print(soup.find_all(attrs={'id': 'list-1'}))
print(soup.find_all(attrs={'name': 'elements'}))

print(soup.find_all(id='list-1'))
print(soup.find_all(class_='element'))

print(soup.find_all(text='Foo'))
  • 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选择器)
print(soup.select('.panel .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
print(type(soup.select('ul')[0]))

select_one只获取选择器选中的一个标签

总结

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

相关文章