使用 BeautifulSoup 查找所有“ul”和“li”元素

2023-12-24

我目前正在 Python 中编写一个爬行脚本,我想将以下 HTML 响应映射到多重列表或字典中(这并不重要)。

我当前的代码是:

from bs4 import BeautifulSoup
from urllib.request import Request, urlopen

req     = Request("https://my.site.com/crawl", headers={'User-Agent': 'Mozilla/5.0'})
webpage = urlopen(req)
soup    = BeautifulSoup(webpage, 'html.parser')
ul      = soup.find('ul', {'class': ''})

运行后我得到以下结果存储在ul:

<ul>
    <li><a class="reference" href="#ref1">Data1</a></li>
    <li><a class="reference" href="#ref2">Data2</a>
        <ul>
            <li><a class="reference" href="#ref3">Data3</a></li>
            <li><a class="reference" href="#ref4">Data4</a>
                <ul>
                    <li><a class="reference" href="#ref5"><span class="pre">Data5</span></a></li>
                    <li><a class="reference" href="#ref6"><span class="pre">Data6</span></a></li>
                    .
                    .
                    .
                </ul>
            </li>
        </ul>
    </li>
    <li><a class="reference" href="#ref7">Data7</a>
        <ul>
            <li><a class="reference" href="#ref8"><span class="pre">Data8</span></a></li>
            <li><a class="reference" href="#ref9"><span class="pre">Data9</span></a></li>
            .
            .
            .
        </ul>
    </li>
    <li><a class="reference" href="#ref10">Data10</a>
        <ul>
            <li><a class="reference" href="#ref11"><span class="pre">Data11</span></a></li>
            <li><a class="reference" href="#ref12">Data12</a></li>
        </ul>
    </li>
</ul>

由于这是一个外部站点,我无法控制列表中元素的 ID 或类。

看来我无法理解这个问题,有没有一种简单的方法可以将数据排列到列表或字典中?:

dict = {'Data1': {'href': 'ref1'}, 
        'Data2': {'href': 'ref2', {
                  'Data3': {'href': 'ref3'}, 
                  'Data4': {'href': 'ref4', {
                            'Data5': {'href': 'ref5'},
                            'Data6': {'href': 'ref6'},
                                    .
                                    .
                                    .                }
                                    }
                       }
               }
       }

我确实觉得这是一个麻烦的过程,但是我没有看到任何其他方法。

非常感谢任何帮助我朝着正确方向前进的帮助!

Cheers!


只需递归ul元素,拉出所有的文本li具有文本的元素,如果存在则递归得更深<ul>元素代替:

def parse_ul(elem):
    result = {}
    for sub in elem.find_all('li', recursive=False):
        if sub.a is None:
            continue
        data = {k: v for k, v in sub.a.attrs.items() if k != 'class'}
        if sub.ul is not None:
            # recurse down
            data['children'] = parse_ul(sub.ul)
        result[sub.a.get_text(strip=True)] = data
    return result

这需要所有直接li元素;如果有一个<a>元素 该锚元素的文本被转换为键,我们将标签属性的副本存储为值(忽略任何class属性)。如果有also a <ul>旁边的元素a标签,它被递归地解析并添加为children属性字典的键<a> tag.

对于您的示例输入,这会产生:

>>> from pprint import pprint    
>>> pprint(parse_ul(soup.ul))
{'Data1': {'href': '#ref1'},
 'Data10': {'children': {'Data11': {'href': '#ref11'},
                         'Data12': {'href': '#ref12'}},
            'href': '#ref10'},
 'Data2': {'children': {'Data3': {'href': '#ref3'},
                        'Data4': {'children': {'Data5': {'href': '#ref5'},
                                               'Data6': {'href': '#ref6'}},
                                  'href': '#ref4'}},
           'href': '#ref2'},
 'Data7': {'children': {'Data8': {'href': '#ref8'}, 'Data9': {'href': '#ref9'}},
           'href': '#ref7'}}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 BeautifulSoup 查找所有“ul”和“li”元素 的相关文章

  • Docker 进程被神秘的“Killed”消息杀死

    在 docker 容器中运行 python 脚本 一切似乎都运行顺利 看到一些 STDOUT 消息 大约 5 分钟后我得到了Killed消息 没有进一步的解释 并且该过程停止 查询数据库可能是磁盘空间问题 也可能是 OOM 问题 我不确定
  • 在 python + openCV 中使用网络摄像头的问题

    我正在使用以下代码使用 openCV python 访问我的网络摄像头 import cv cv NamedWindow webcam feed cv CV WINDOW AUTOSIZE cam cv CaptureFromCAM 1 然
  • 关于使用Python启动SSH隧道的问题

    我在从用 Python 编写的 HTTP RPC 服务器启动 SSH 隧道时遇到了麻烦 基于Python的BaseHTTPServer 有一个用Python编写的简单的HTTP RPC服务器 作为其中一项服务的一部分 我想启动从 RPC 服
  • 如何测试顶级窗口是否打开?

    我感觉 Python 编程可能不是我的菜 我创建了一个 tkinter GUI 它使用按钮回调来打开另一个窗口 其他搜索说这个窗口应该是顶级窗口 并且它工作得很好 但是每次按下按钮时它都会打开另一个相同的窗口 如据我所知 窗口 问题 如何测
  • 刷新访问令牌时出现“invalid_grant”错误的情况?

    最近我一直在为这个问题揪心 一些背景 使用oauth2客户端 https code google com p google api python client 库来管理用户的令牌 这些令牌用于定期并发执行各种后台任务 每次要为用户运行其中一
  • OpenCV Python 删除图像中的某些对象

    我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星 例如这个1 https i stack imgur com AKwEJ jpg图片 使用模板匹配 我可以用阈值检测星星 单击 2 2 https i sta
  • Python中#和"""注释的区别

    开始用 Python 编程 我看到一些带有注释的脚本 and comments 这两种评论方式有什么区别 最好的事情就是阅读PEP 8 Python 代码风格指南 https www python org dev peps pep 0008
  • 在 Python 中比较日期 - 如何处理时区修饰符

    我正在做Python日期比较 假设我有一个这样的约会 Fri Aug 17 12 34 00 2012 0000 我按以下方式解析它 dt datetime strptime Fri Aug 17 12 34 00 2012 0000 a
  • 用于打印 C/C++ 文件的所有函数定义的 Python 脚本

    我想要一个 python 脚本来打印 C C 文件中定义的所有函数的列表 e g abc c定义两个函数为 void func1 int func2 int i printf d i return 1 我只想搜索文件 abc c 并打印其中
  • 打印一个 Jupyter 单元中定义的所有变量

    有没有一种更简单的方法来以漂亮的方式显示单个单元格中定义的所有变量的名称和值 我现在做的方式是这样的 但是当有30个或更多变量时我浪费了很多时间 您可以使用whos http ipython readthedocs io en stable
  • keras 预测内存交换无限期增加

    我使用keras实现了一个分类程序 我有一大组图像 我想使用 for 循环来预测每个图像 然而 每次计算新图像时 交换内存都会增加 我尝试删除预测函数内部的所有变量 并且我确信该函数内部存在问题 但内存仍然增加 for img in ima
  • 超时时杀死或终止子进程?

    我想尽可能快地重复执行子进程 然而 有时这个过程会花费太长的时间 所以我想杀死它 我使用 signal signal 如下所示 ppid pipeexe pid signal signal signal SIGALRM stop handl
  • 如何在Python中获取绝对文件路径

    给定一条路径 例如 mydir myfile txt 如何在Python中找到文件的绝对路径 例如 在 Windows 上 我最终可能会得到 C example cwd mydir myfile txt gt gt gt import os
  • 从文档字符串生成 sphinx 文档不起作用

    我有一个具有以下结构的项目 我想保留 my project build here is where sphinx should dump into requirements txt make bat Makefile more config
  • 散景中的时间序列流

    我想在散景中绘制实时时间序列 我只想在每次更新时绘制新的数据点 我怎样才能做到这一点 散景网站上有一个动画情节的示例 但它每次都需要重新绘制整个图片 另外 我正在寻找一个简单的示例 我可以在其中逐点绘制时间序列的实时绘图 散景效果0 11
  • tweepy 流到 sqlite 数据库 - 语法错误[重复]

    这个问题在这里已经有答案了 可能的重复 tweepy 流到 sqlite 数据库 语法无效 https stackoverflow com questions 9434205 tweepy stream to sqlite database
  • 对 pandas 数据框中的每一列应用函数

    我如何以更多的熊猫方式编写以下函数 def calculate df columns mean self df means for column in df columns columns tolist cleaned data self
  • 如何在 Python 中解析损坏的 XML?

    我无法影响的服务器发送的 XML 非常损坏 具体来说 Unicode WHITE STAR 将被编码为 UTF 8 E2 98 86 然后使用 Latin 1 转换为 HTML 实体表 我得到的是 acirc 98 86 9 个字节 位于声
  • 提供节点名或服务名,或未知

    我收到这个 Python 错误 File Library Frameworks Python framework Versions 2 7 lib python2 7 urllib2 py line 1184 in do open rais
  • 如何获取所有Python标准库模块的列表?

    我想要类似的东西sys builtin module names标准库除外 其他不起作用的事情 sys modules 只显示已经加载的模块 sys prefix 包含非标准库模块并且似乎无法在 virtualenv 内工作的路径 我想要这

随机推荐

  • 生产环境中显示开发异常

    我知道这是一个很大的 不 并且在我的网站上线时不应该显示开发人员错误页面 我该怎么做才能确保开发环境错误消息不会出现在生产中 为什么会出现这些 我以为在生产模式下它默认是关闭的 我错过了一个设置吗 Note 这是在共享服务器上 我使用的是a
  • ArangoDB - 如何在图遍历中执行计算?

    我有一个简单的图表来跟踪我借钱给的人 所以图表看起来像这样 userB owes to amount 200 gt userA userC owes to amount 150 gt userA 等等 假设您需要使用图形遍历来找出每个用户欠
  • 控件不显示是否在后台线程上运行(c# winform)

    我有一个表格 复杂形式在代码中 具有多个控件 需要一些时间来加载 因此 我决定放入一个单独的线程中 以减少初始加载时间 除了等待表单上的标签控件 Form1在代码中 最初不显示 就在 Form1 响起之前的一瞬间 所以我的问题是 为什么标签
  • QMimeData 中的 Python 对象

    我正在基于我的自定义模型实现拖放 QTreeView 一切正常 我的树显示数据 启用了拖放 现在最后一步就在我面前 放置和传输拖动的数据 为此 我需要在模型中实现 mimeTypes mimeData 和 dropMimeData 方法 现
  • 将多个canvas转换为html5中的dataURL

    我想加入多个画布来制作一个图像 那么有没有什么方法可以将多于一张画布隐藏起来toDataURL制作单个图像 创建一个函数 该函数接受多个参数 画布元素 将它们放在一个空白画布上 然后返回新制作的画布的 dataurl var getImad
  • Java 中的逻辑表示法

    绝对基本的 Java 问题 我在 Google 上很难找到 以下是什么意思 7 8 0 这相当于写 7 0 8 0 我写了一个快速的 main 来测试这一点 情况似乎确实如此 我只是想确保我没有遗漏任何东西 Nope is 按位和 http
  • Python 应用程序输出到系统日志服务器

    我正在尝试在谷歌上进行一些搜索 每 5 分钟左右循环一次 当它受到攻击时 我希望它将结果推送到系统日志服务器 我对 python 很陌生 所以请原谅我的无知 我已经搜索了很长时间 但找不到我的问题的答案 我打算添加多个查询来查找不同的结果
  • 逻辑数组 - 在赋值 A(I) = B 中,B 和 I 中的元素数量必须相同

    我有三个矩阵 A B和C 当B大于A时 我想用A使该值饱和 它表示I中的元素数量 即 B gt A 必须与A 中的元素数量 我检查了下面 它们是相同的 gt gt A 5 5 5 5 5 5 5 5 5 gt gt B 2 2 2 2 2
  • 尝试将 Django 国家添加到 Django

    我是 django 的新手 我正在尝试安装 django 国家 但遇到了问题 我安装自http pypi python org pypi django countries 1 0 1 http pypi python org pypi dj
  • 在 asp.net mvc 中使用 jQuery 动态删除表行

    我有一个表 可以动态添加和删除行 model AHBReports Models AdjustmentModel using Html BeginForm table Html EditorFor model gt model Adjust
  • 确定运行 .NET 应用程序的系统要求

    如何确定 NET 应用程序的最低系统要求 我希望能够确定应列出的运行应用程序的最低系统要求 RAM CPU 等 该应用程序是用 C 编写的 并使用 NET 3 5 和 DirectX9 这一切都是关于反复试验 在各种设置中运行它以查看它是否
  • 添加 TwilioController 基类继承后,Microsoft Azure MVC 3 Web 角色未启动

    Azure Web 角色 MVC 3 项目 不会以 Twilio 控制器类启动 我有一个托管在 MS Azure 上的 MVC 3 应用程序 它发布到 Azure Web 角色 没有问题 我添加了 Nuget Twilio 和 Twilio
  • Android 向后代码兼容性

    我正在开发一个应用程序 使用 android hardware Camera parameters getSupportedPictureSizes 这仅适用于 SDK 版本 8 我希望与 SDK 4 兼容 所以我这样做了 if Build
  • 属性错误:“模块”对象没有属性“读者”[重复]

    这个问题在这里已经有答案了 我收到错误 AttributeError 模块 对象没有属性 读者 当我运行下面的代码但我不明白为什么 import csv with open test csv as f q csv reader f 您导入了
  • Pod 处于挂起阶段(错误:FailedScheduling:节点与节点选择器不匹配)

    我的其中一个 pod 有问题 它说它处于待处理状态 如果我描述这个 Pod 我会看到以下内容 Events Type Reason Age From Message Normal NotTriggerScaleUp 1m x58 over
  • 使用 Android Studio 3.1 和 gradle 3.1.0 构建项目时出错

    我对这个项目有一个问题 我尝试在将 Android Studio 更新到 3 1 版本后构建它 我也将 gradle 更新到版本 3 1 0 只是 gradle Sync 工作正常 但尝试编译所有项目显示了这个错误 我已经将构建工具和所有库
  • ejabberd MUC 消息历史记录

    我使用 ejabberd XMPP 服务器作为聊天客户端 它还具有群聊功能 我的问题是 当新用户加入群组房间时 他只能收到来自该房间的前 20 条消息 尽管 History size 设置为 200 目前 在客户端 当新用户加入房间时 存在
  • Java 中“易失性”是什么意思?

    We use volatile在我们的一个项目中 维护由不同线程访问的变量的相同副本 我的问题是是否可以使用volatile with static 编译器没有给出任何错误 但我不明白使用两者的原因 如果没有阅读内存模型规范 我建议您阅读h
  • 如何使用 .net core 的 ILoggerFactory 写入自定义事件源?有没有办法指定来源?

    我正在尝试写入 netcore c 中的自定义事件源 但尚未找到指定 net core 记录器对象的目标源的方法 在这种情况下 我想写入 我的事件日志 而不是应用程序日志 下面的代码成功写入应用程序日志 但我想将其指向 我的事件日志 事件源
  • 使用 BeautifulSoup 查找所有“ul”和“li”元素

    我目前正在 Python 中编写一个爬行脚本 我想将以下 HTML 响应映射到多重列表或字典中 这并不重要 我当前的代码是 from bs4 import BeautifulSoup from urllib request import R