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文档。
- 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.title
、soup.h1
来获取第一个匹配的<title>
和<h1>
标签,使用.string
来获取标签内的字符串。
- 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对象。
- 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
类型的对象。
- 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
的标签。
- 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
的格式来查找带有idname
id的标签。
总结
此处的教程还只是 BeautifulSoup 的入门,了解了这些必须掌握的知识点,进一步学习时可以查看更多的文档和使用案例。换言之,如今各个网站渲染方式和代码构建方案不同,不可能有一套百发百中的解决方案。因此多看源代码,分类别细致,思考规律变化是跃升到下一层的必要基础。
相关文章