首页 > 其他分享 >BeatifulSoup

BeatifulSoup

时间:2024-03-31 17:13:36浏览次数:9  
标签:标签 BeautifulSoup soup 文档 BeatifulSoup print find

BeatifulSoup

(1)介绍

  • Beautiful Soup是Python库,用于解析HTML和XML文档。它提供简单而强大的工具,帮助用户从网页中提取数据。通过查找元素、遍历文档树和处理编码问题,它简化了数据提取过程。适用于网页抓取、数据挖掘和分析等应用场景。
pip install beautifulsoup4
from bs4 import BeautifulSoup

(2)解析器

  • 内置解析器html.parser
soup = BeautifulSoup('页面源码',html.parser)
  • 第三方解析器lxml
soup = BeautifulSoup('页面源码','lxml')
  • html5lib
pip install html5lib
soup = BeautifulSoup('页面源码','html5lib')

(3)使用

(1)生成soup对象

  • 打开本地文件
soup = BeautifulSoup(open('index.html'),'lxml')
  • 直接把页面源码放进去
soup = BeautifulSoup('<html>data</html>','lxml')
import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent

url = 'http://www.baidu.com'

headers = {
    'User-Agent': UserAgent().random
}
res = requests.get(url=url,headers=headers)

soup = BeautifulSoup(res.text,'lxml')
print(soup)

(4)BeautifulSoup四个对象

(1)BeautifulSoup对象

  • 代表整个解析后的HTML文档,是最顶层的对象。
  • 它包含了整个文档的全部内容,并提供了操作HTML文档的方法和属性。
soup = BeautifulSoup(res.text, 'lxml')

(2)Tag对象

  • 表示HTML中的标签,如<p>、<a>等。
  • Tag对象包含了标签的名称和对应的属性,并可以通过Tag对象来获取标签内的内容或进行进一步的操作。
  • 可以通过传递HTML文档给BeautifulSoup类初始化的方式创建Tag对象。

(1)查找tag对象

  • 通过soup.tag名获取到指定标签对象
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><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_doc, 'lxml')

print(soup.head, type(soup.head))
# <head><title>The Dormouse's story</title></head> <class 'bs4.element.Tag'>

print(soup.title, type(soup.title))
# <title>The Dormouse's story</title> <class 'bs4.element.Tag'>

print(soup.a, type(soup.a))
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> <class 'bs4.element.Tag'>

print(soup.p.b)
# <b>The Dormouse's story</b>

(2)查找tag对象的标签名和属性

  • 通过soup.tag名.属性名获取到指定标签属性名对应的属性值
print(soup.a.name)  # a

print(soup.p.b.name)  # b

print(soup.a["href"])  # http://example.com/elsie

print(soup.a.attrs)  # {'href': 'http://example.com/elsie', 'class': ['sister'], 'id': 'link1'}

(3)返回多值的属性

print(soup.a["class"])  # ['sister']

(4)修改tag的属性

soup.a["class"] = ["sister c1"]
# 删除第一个a标签的id属性值
del soup.a["id"]

(5)获取标签对象的文本内容

print(soup.p.string) # 直接拿文本内容

# 拿到一个生成器对象, 取到p下所有的文本内容
print(soup.p.strings)
# <generator object Tag._all_strings at 0x000001AEFAEC2FF0>

for i in soup.p.strings:
    print(i)
# The Dormouse's story

总结:

三种拿文本的方式

​ string

​ text

​ get_text()

(5)搜索文档树语法

(1)find_all 查找所有

  • 在当前页面文档中查找所有符合条件的标签
soup.find_all(name='a')
soup.find_all(name=['a', 'p'])
soup.find_all(True) # 匹配所有的tag,不会返回字符串节点

# 返回所有 href 属性等于 "http://example.com/tillie" 的标签。
print(soup.find_all(href="http://example.com/tillie"))

 # 返回所有包含文本 "Elsie" 的标签
print(soup.find_all(text="Elsie"))

# 返回所有包含文本 "Tillie"、"Elsie" 或 "Lacie" 的标签。
print(soup.find_all(text=["Tillie", "Elsie", "Lacie"]))

# 返回所有a标签,限制2个
print(soup.find_all("a", limit=2))

# 只会查找当前soup文档的直接子元素中的 <div> 标签。
print(soup.find_all("div", recursive=False))

(2)find 查找单个

  • find() 方法用于在文档中查找符合条件的tag,并返回第一个匹配的结果。
  • 它可以通过指定name、attrs、recursive和string等参数来过滤查找结果。

(6)select语法

  • Beautiful Soup库中的 select() 方法是用于通过 CSS 选择器来选择元素的方法。它返回匹配选择器的所有元素列表。

    1. 语法

      select(css_selector)
      
      • css_selector: 要使用的CSS选择器字符串。
    2. 选择器

      • 通过标签名选择:例如,'p' 选择所有 <p> 标签。
      • 通过类名选择:例如,'.classname' 选择所有带有指定类名的元素。
      • 通过ID选择:例如,'#idname' 选择具有指定ID的元素。
      • 通过属性选择:例如,'[attribute=value]' 选择具有指定属性值的元素。
      • 组合选择器:可以组合多个选择器,例如,'p.title' 选择所有带有 class="title"<p> 元素。
    3. 返回值

      • select() 方法返回一个列表,包含匹配选择器的所有元素。
    4. 示例

      from bs4 import BeautifulSoup
      
      # HTML文档
      html_doc = """
      <html>
      <head>
      <title>Sample Page</title>
      </head>
      <body>
      <div id="content">
      <p class="para1">Paragraph 1</p>
      <p class="para2">Paragraph 2</p>
      <p class="para1">Paragraph 3</p>
      </div>
      </body>
      </html>
      """
      
      # 创建BeautifulSoup对象
      soup = BeautifulSoup(html_doc, 'html.parser')
      
      # 选择所有 <p> 标签
      paragraphs = soup.select('p')
      print(paragraphs)
      
      # 选择类为 "para1" 的 <p> 标签
      para1 = soup.select('.para1')
      print(para1)
      
      # 选择ID为 "content" 的 <div> 标签
      content_div = soup.select('#content')
      print(content_div)
      

      输出:

      [<p class="para1">Paragraph 1</p>, <p class="para2">Paragraph 2</p>, <p class="para1">Paragraph 3</p>]
      [<p class="para1">Paragraph 1</p>, <p class="para1">Paragraph 3</p>]
      [<div id="content"><p class="para1">Paragraph 1</p><p class="para2">Paragraph 2</p><p class="para1">Paragraph 3</p></div>]
      

标签:标签,BeautifulSoup,soup,文档,BeatifulSoup,print,find
From: https://www.cnblogs.com/ssrheart/p/18106944

相关文章