在本章中,我们将探索如何使用Beautiful Soup在HTML文档中查找所有的标题元素。HTML定义了从H1到H6的六个标题样式,每个样式的字体大小逐渐减小。适合的标签用于页面的不同部分,如主标题、章节标题、主题等。我们将使用find_all()
方法以两种不同的方式来提取HTML文档中的所有标题元素。
我们将使用以下HTML脚本(保存为index.html)作为本章代码示例的基础:
<html>
<head>
<title>BeautifulSoup - Scraping Headings</title>
</head>
<body>
<h2>Scraping Headings</h2>
<b>The quick, brown fox jumps over a lazy dog.</b>
<h3>Paragraph Heading</h3>
<p>DJs flock by when MTV ax quiz prog.</p>
<h3>List heading</h3>
<ul>
<li>Junk MTV quiz graced by fox whelps.</li>
<li>Bawds jog, flick quartz, vex nymphs.</li>
</ul>
</body>
</html>
示例 1
在这个方法中,我们收集解析树中的所有标签,并检查每个标签的名字是否出现在所有标题标签的列表中。
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
headings = ['h1','h2','h3', 'h4', 'h5', 'h6']
tags = soup.find_all()
heads = [(tag.name, tag.contents[0]) for tag in tags if tag.name in headings]
print(heads)
这里,headings
是一个包含所有标题样式 h1 到 h6 的列表。如果一个标签的名字是这些中的任何一个,那么这个标签及其内容就会被收集在一个名为 heads
的列表中。
输出
[('h2', 'Scraping Headings'), ('h3', 'Paragraph Heading'), ('h3', 'List heading')]
示例 2
你可以将正则表达式传给 find_all()
方法。看看下面的正则表达式:
re.compile('^h[1-6]$')
这个正则表达式找到了所有以 h 开头,在 h 后面有一个数字,并且在数字之后结束的标签。我们将在下面的代码中将此作为 find_all()
方法的一个参数使用:
from bs4 import BeautifulSoup
import re
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
tags = soup.find_all(re.compile('^h[1-6]$'))
print(tags)
输出
[<h2>Scraping Headings</h2>, <h3>Paragraph Heading</h3>, <h3>List heading</h3>]