
本文将详细介绍如何利用Python的Beautiful Soup库,结合CSS选择器,从非结构化HTML中精确提取特定文本内容。通过 `:has()` 伪类和 `stripped_strings` 方法,即使在复杂嵌套的表格结构中,也能高效定位并提取 `
` 标签后的目标字符串,从而解决常见的网页数据抓取难题。
在网页数据抓取(Web Scraping)任务中,我们经常需要从非结构化的HTML文档中提取出特定的信息。Python的Beautiful Soup库是一个功能强大且易于使用的工具,它能够解析HTML和XML文档,并提供多种方法来搜索、导航和修改解析树。
本教程将聚焦于一个常见场景:从一个包含复杂表格结构的HTML中,提取位于特定 <td> 元素内、紧跟在 <br> 标签之后的文本内容。
假设我们有以下HTML结构,目标是提取“aaa”和“bbb”这两个字符串:
立即学习“前端免费学习笔记(深入)”;
<html>
<head></head>
<body>
    <table style="max-width: 600px; margin: auto;">
        <tbody>
            <tr>
                <td>Swan</td>
                <td>Flower</td>
            </tr>
            <tr>
                <td colspan="2" style="background: #ffffff;">
                    <h5>Playground</h5>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <strong>Animal:</strong>
                    <br>aaa</td>
            </tr>
            <tr>
                <td colspan="2">
                    <strong>Fish:</strong>
                    <br>bbb</td>
            </tr>
            <tr>
                <td colspan="2" style="text-align: center;">
                    <form method="post">
                        <input type="hidden" name="yyy" value="7777">
                        <input type="hidden" name="rrr" value="wssss">
                        <input type="submit" value="djd ddd" style="width: 250px;">
                    </form>
                </td>
            </tr>
        </tbody>
    </table>
</body>
</html>观察目标字符串“aaa”和“bbb”的上下文,它们都满足以下条件:
初学者可能会尝试使用 soup.find_all('td', {'colspan': '2', 'strong': True}) 这样的方式来定位,但这种方法是无效的,因为 strong 并不是 <td> 标签的一个属性,而是一个子元素。因此,我们需要一种更灵活、更强大的选择机制。
Beautiful Soup支持使用CSS选择器进行元素查找,这为我们提供了极大的灵活性。结合CSS选择器中的 :has() 伪类,我们可以实现基于子元素内容的复杂匹配。
核心思路是:
下面是实现这一目标的Python代码:
from bs4 import BeautifulSoup
# 模拟HTML内容
html_text = """\
<html>
<head></head>
<body>
    <table style="max-width: 600px; margin: auto;">
        <tbody>
            <tr>
                <td>Swan</td>
                <td>Flower</td>
            </tr>
            <tr>
                <td colspan="2" style="background: #ffffff;">
                    <h5>Playground</h5>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <strong>Animal:</strong>
                    <br>aaa</td>
            </tr>
            <tr>
                <td colspan="2">
                    <strong>Fish:</strong>
                    <br>bbb</td>
            </tr>
            <tr>
                <td colspan="2" style="text-align: center;">
                    <form method="post">
                        <input type="hidden" name="yyy" value="7777">
                        <input type="hidden" name="rrr" value="wssss">
                        <input type="submit" value="djd ddd" style="width: 250px;">
                    </form>
                </td>
            </tr>
        </tbody>
    </table>
</body>"""
# 使用Beautiful Soup解析HTML
soup = BeautifulSoup(html_text, "html.parser")
# 使用CSS选择器定位目标<td>元素
# "td:has(strong)" 表示选择所有包含一个<strong>子元素的<td>元素
for td in soup.select("td:has(strong)"):
    # stripped_strings 会生成一个迭代器,包含元素及其子元素中所有非空的、去除首尾空白的字符串
    # 按照HTML中的顺序排列
    # 在本例中,'Animal:', 'aaa' 或 'Fish:', 'bbb'
    # 目标文本是迭代器中的最后一个字符串
    text = list(td.stripped_strings)[-1]
    print(text)
输出结果:
aaa bbb
通过结合Beautiful Soup的 select() 方法和CSS选择器中的 :has() 伪类,我们可以实现对HTML元素的精确匹配。再辅以 stripped_strings 属性,能够高效、准确地从复杂或非结构化的HTML中提取出目标文本内容。掌握这些技巧,将大大提升你在Python进行网页数据抓取时的效率和代码的鲁棒性。
以上就是使用Beautiful Soup从非结构化HTML中精确提取特定文本的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号