Python BeautifulSoup 教程

2023-04-17 00:00:00 python beautifulsoup 教程

BeautifulSoup是一个用于解析HTML和XML文档的Python库。它可以让我们轻松的从网页中提取出需要的信息。

安装BeautifulSoup

在使用BeautifulSoup之前,首先需要安装。可以使用pip来安装,执行下面的命令:

pip install beautifulsoup4

使用BeautifulSoup

使用BeautifulSoup的第一步是将需要解析的HTML或XML文档传给它。这可以通过将文档作为字符串或通过将文档的URL传递给BeautifulSoup对象来完成。

将HTML字符串传给BeautifulSoup对象:

from bs4 import BeautifulSoup

html_doc = "<html><head><title>pidancode.com</title></head><body><h1>皮蛋编程</h1><p>欢迎访问皮蛋编程!</p></body></html>"

soup = BeautifulSoup(html_doc, 'html.parser')

print(soup.prettify())

上面的代码将HTML字符串传给BeautifulSoup对象,并使用prettify()方法打印了解析后的HTML文档。下面是运行结果:

<html>
 <head>
  <title>
   pidancode.com
  </title>
 </head>
 <body>
  <h1>
   皮蛋编程
  </h1>
  <p>
   欢迎访问皮蛋编程!
  </p>
 </body>
</html>

将URL传给BeautifulSoup对象:

from bs4 import BeautifulSoup
import requests

url = 'http://www.pidancode.com'
response = requests.get(url)
html_doc = response.content

soup = BeautifulSoup(html_doc, 'html.parser')

print(soup.prettify())

上面的代码将URL传给BeautifulSoup对象,并使用prettify()方法打印了解析后的HTML文档。下面是运行结果:

<!DOCTYPE html>
<html lang="zh-CN">
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1" name="viewport"/>
  <title>
   皮蛋编程 - 做最有诚意的技术分享
  </title>
  <meta content="皮蛋编程是一个致力于提供高质量技术文章,分享个人经验的博客。" name="description"/>
  <meta content="皮蛋编程,技术博客,python,java,c++,web,android" name="keywords"/>
  <link href="/icons/icon-192x192.png" rel="icon" sizes="192x192" type="image/png"/>
  <link href="/icons/icon-128x128.png" rel="icon" sizes="128x128" type="image/png"/>
  <link href="/icons/icon-32x32.png" rel="icon" sizes="32x32" type="image/png"/>
  <link href="/icons/icon-16x16.png" rel="icon" sizes="16x16" type="image/png"/>
  <link href="/feeds/all.atom.xml" rel="alternate" title="皮蛋编程" type="application/atom+xml"/>
  <link href="/static/css/main.css" rel="stylesheet"/>
 </head>
 <body class="home-template">
  <div class="container">
   <header class="site-header">
    <div class="site-header-inner">
     <a class="site-title" href="http://www.pidancode.com">皮蛋编程</a>
     <nav class="site-nav">
      <ul>
       <li class="current-menu-item"><a href="/">主页</a></li>
       <li><a href="/category/python/">Python</a></li>
       <li><a href="/category/java/">Java</a></li>
       <li><a href="/category/android/">Android</a></li>
       <li><a href="/about/">关于</a></li>
      </ul>
     </nav>
    </div>
   </header>
   <div class="posts">
    <div class="post">
     <h2 class="post-title"><a href="/python-web-scraping/">Python 爬虫教程</a></h2>
     <div class="post-date">2021-03-10</div>
     <div class="post-excerpt">
      讲解 Python 爬虫相关知识,介绍最流行的 BeautifulSoup 和 Scrapy框架。
...

解析HTML文档

一旦我们将HTML文档传递给BeautifulSoup对象,我们就可以使用一些方法来解析HTML文档。

  1. Tag

Tag是HTML或XML文档中的标签,如<head><title>等。可以使用soup.tag来获取第一个匹配的Tag,如soup.title可以获取HTML文档中的第一个<title>标签。可以使用.string来获取Tag内的字符串。

from bs4 import BeautifulSoup

html_doc = "<html><head><title>pidancode.com</title></head><body><h1>皮蛋编程</h1><p>欢迎访问皮蛋编程!</p></body></html>"

soup = BeautifulSoup(html_doc, 'html.parser')

print(soup.title)
# <title>pidancode.com</title>

print(soup.title.string)
# pidancode.com

print(soup.h1)
# <h1>皮蛋编程</h1>

print(soup.h1.string)
# 皮蛋编程

在上面的代码中,我们使用soup.titlesoup.h1来获取第一个匹配的<title><h1>标签,使用.string来获取标签内的字符串。

  1. NavigableString

NavigableString是Tag内的字符串。可以使用.string来获取Tag内的字符串。

from bs4 import BeautifulSoup, NavigableString

html_doc = "<html><head><title>pidancode.com</title></head><body><h1>皮蛋编程</h1><p>欢迎访问皮蛋编程!</p></body></html>"

soup = BeautifulSoup(html_doc, 'html.parser')

title_str = soup.title.string
print(type(title_str))
# <class 'bs4.element.NavigableString'>

title_str = NavigableString('pidancode.com')
print(type(title_str))
# <class 'bs4.element.NavigableString'>

在上面的代码中,我们使用type()方法来检查soup.title.string的类型,发现它是一个NavigableString类型的对象。

我们也可以使用NavigableString()方法来创建一个NavigableString对象。

  1. Comment

Comment是HTML或XML文档中的注释。可以使用soup.comment来获取第一个匹配的注释。

from bs4 import BeautifulSoup, Comment

html_doc = "<html><!--这是一个注释--><body><h1>皮蛋编程</h1><p>欢迎访问皮蛋编程!</p></body></html>"

soup = BeautifulSoup(html_doc, 'html.parser')

comment = soup.comment
print(type(comment))
# <class 'bs4.element.Comment'>

print(comment)
# <!--这是一个注释-->

在上面的代码中,我们使用soup.comment来获取HTML文档中的注释,使用type()方法来检查它的类型,发现它是一个Comment类型的对象。

  1. find_all()方法

find_all()方法可以通过多种方式搜索文档树来查找Tag。

使用标签名称搜索:

from bs4 import BeautifulSoup

html_doc = "<html><head><title>pidancode.com</title></head><body><h1>皮蛋编程</h1><p>欢迎访问皮蛋编程!</p></body></html>"

soup = BeautifulSoup(html_doc, 'html.parser')

h1_tags = soup.find_all('h1')
print(h1_tags)
# [<h1>皮蛋编程</h1>]

p_tags = soup.find_all('p')
print(p_tags)
# [<p>欢迎访问皮蛋编程!</p>], </body></html>]

在上面的代码中,我们使用soup.find_all('h1')来查找HTML文档中所有的<h1>标签,使用soup.find_all('p')来查找HTML文档中所有的<p>标签。

使用正则表达式搜索:

import re
from bs4 import BeautifulSoup

html_doc = "<html><head><title>pidancode.com</title></head><body><h1>皮蛋编程</h1><p>欢迎访问皮蛋编程!</p></body></html>"

soup = BeautifulSoup(html_doc, 'html.parser')

tags = soup.find_all(re.compile('^h'))
print(tags)
# [<head><title>pidancode.com</title></head>, <h1>皮蛋编程</h1>]

在上面的代码中,我们使用re.compile('^h')来搜索以h开头的标签。

使用关键字搜索:

from bs4 import BeautifulSoup

html_doc = "<html><head><title>pidancode.com</title></head><body><h1>皮蛋编程</h1><p>欢迎访问皮蛋编程!</p></body></html>"

soup = BeautifulSoup(html_doc, 'html.parser')

tags = soup.find_all(class_='site-title')
print(tags)
# [<a class="site-title" href="http://www.pidancode.com">皮蛋编程</a>]

tags = soup.find_all(id='search-form')
print(tags)
# []

在上面的代码中,我们使用class_来搜索class为site-title的标签,使用id来搜索id为search-form的标签。

  1. select()方法

select()方法可以使用CSS选择器来查找Tag。

使用标签名称查找:

from bs4 import BeautifulSoup

html_doc = "<html><head><title>pidancode.com</title></head><body><h1>皮蛋编程</h1><p>欢迎访问皮蛋编程!</p></body></html>"

soup = BeautifulSoup(html_doc, 'html.parser')

title = soup.select('title')
print(title)
# [<title>pidancode.com</title>]

h1 = soup.select('h1')
print(h1)
# [<h1>皮蛋编程</h1>]

p = soup.select('p')
print(p)
# [<p>欢迎访问皮蛋编程!</p>]

在上面的代码中,我们使用select('tagname')来查找HTML文档中所有的tagname标签。

使用class查找:

from bs4 import BeautifulSoup

html_doc = "<html><head><title>pidancode.com</title></head><body><h1 class='site-title'>皮蛋编程</h1><p>欢迎访问皮蛋编程!</p></body></html>"

soup = BeautifulSoup(html_doc, 'html.parser')

h1 = soup.select('.site-title')
print(h1)
# [<h1 class="site-title">皮蛋编程</h1>]

在上面的代码中,我们使用.classname的格式来查找带有classname类的标签。

使用id查找:

from bs4 import BeautifulSoup

html_doc = "<html><head><title>pidancode.com</title></head><body><h1 id='site-title'>皮蛋编程</h1><p>欢迎访问皮蛋编程!</p></body></html>"

soup = BeautifulSoup(html_doc, 'html.parser')

h1 = soup.select('#site-title')
print(h1)
# [<h1 id="site-title">皮蛋编程</h1>]

在上面的代码中,我们使用#idname的格式来查找带有idnameid的标签。

总结

此处的教程还只是 BeautifulSoup 的入门,了解了这些必须掌握的知识点,进一步学习时可以查看更多的文档和使用案例。换言之,如今各个网站渲染方式和代码构建方案不同,不可能有一套百发百中的解决方案。因此多看源代码,分类别细致,思考规律变化是跃升到下一层的必要基础。

相关文章