如何编写一个仅解析标签之间具有特定文本的对象的 BeautifulSoup 过滤器?

2024-03-16

我正在使用 Django 和 Python 3.7。我想要更有效的解析,所以我正在阅读有关 SoupStrainer 对象的内容。我创建了一个自定义的来帮助我仅解析我需要的元素......

def my_custom_strainer(self, elem, attrs):
    for attr in attrs:
        print("attr:" + attr + "=" + attrs[attr])
    if elem == 'div' and 'class' in attr and attrs['class'] == "score":
        return True
    elif elem == "span" and elem.text == re.compile("my text"):
        return True

article_stat_page_strainer = SoupStrainer(self.my_custom_strainer)
soup = BeautifulSoup(html, features="html.parser", parse_only=article_stat_page_strainer)

条件之一是我只想解析其文本与特定模式匹配的“span”元素。因此

elem == "span" and elem.text == re.compile("my text")

条款。然而,这会导致

AttributeError: 'str' object has no attribute 'text'

当我尝试运行上面的内容时出错。编写过滤器的正确方法是什么?


TLDR;不,目前这在 BeautifulSoup 中不太可能实现(需要修改 BeautifulSoup 和 SoupStrainer 对象)。

解释:

问题是调用了 Strainer 传递的函数handle_starttag()方法。正如您所猜测的,您只有开始标记中的值(例如元素名称和属性)。

https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/init.py#L524 https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/__init__.py#L524

if (self.parse_only and len(self.tagStack) <= 1
    and (self.parse_only.text
     or not self.parse_only.search_tag(name, attrs))):
return None

正如您所看到的,如果您的 Strainer 函数返回 False,该元素将立即被丢弃,而没有机会考虑内部文本(不幸的是)。

另一方面,如果您添加“文本”进行搜索。

SoupStrainer(text="my text")

它将开始在标签内搜索文本,但这没有元素或属性的上下文 - 你可以看到讽刺:/

将它们组合在一起将一无所获。而且您甚至无法像 find 函数中所示那样访问父级:https://gist.github.com/RichardBrnosky/4060082 https://gist.github.com/RichardBronosky/4060082

所以目前过滤器可以很好地过滤元素/属性。您需要更改大量 Beautiful soup 代码才能使其正常工作。

如果你确实需要这个,我建议继承 BeautifulSoup 和 SoupStrainer 对象并修改它们的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写一个仅解析标签之间具有特定文本的对象的 BeautifulSoup 过滤器? 的相关文章

  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • 将 github 上的包安装到 Spyder 中

    我一直在尝试安装并导入mpl finance来自 github 的包 在我的 Spyder 环境中没有成功 我努力了 pip install e git https github com matplotlib mpl finance git
  • Django在模板中形成多个选择框大小

    我有一个模板
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • AWK:递归下降 CSV 解析器

    响应一个BASH 中的递归下降 CSV 解析器 https codereview stackexchange com questions 11727 need some advice or help with translation and
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject
  • Antlr 解析器运算符优先级

    考虑以下语法 我对运算符优先级有疑问 例如 res 2 a b有一个类似的解析树res 2 a b 我知道问题出在哪里 但我没有想到没有相互左递归的 漂亮 解决方案 你能帮我一点忙吗 该语法与自定义访问者一起使用 grammar Math

随机推荐

  • 未知的输入格式:'x11grab'

    guys 当我编译 ffmpeg 并在 linux 中运行 ffmpeg 时遇到问题 我的环境 1 ubuntu 17 10 x64 bit 我认为操作系统版本不是关键 2 gcc Ubuntu 6 3 0 19ubuntu1 6 3 0
  • 我的异步调用在 forEach 循环中填充列表之前返回

    我有一个例程 它从设备获取文件名列表 然后读取文件以构建列表 然而 调用例程总是返回零项 我打印文件名 所以我知道它们存在 但是 在我读取文件之前 异步似乎正在返回 我在进行 HTTP 调用时使用了类似的代码 但是 这里的某些事情导致例程返
  • 什么是 ./.local/share/Trash (Unix) [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用虚拟机来运行 Java Web 应用程序 操作系统是 XFCE Ubuntu 我使用命令找到了我想要的文件find name s
  • 奇怪的 GCC 错误:程序中出现杂散 '\NNN'

    我的开源库中出现了以下问题 我无法弄清楚发生了什么 我的两个用户有 GCC 编译器错误 如下所示 home someone Source src regex cpp 1 1 warning null character s ignored
  • 错误 ITMS - 90167 在包中找到的应用程序包数量

    在开始撰写有关该错误的文章之前 我正在 macOS Sierra 上运行并使用 Xcode 7 3 1 因此 我从我的应用程序创建一个存档 我验证该应用程序并通过验证 但在上传到应用程序商店时 我收到错误 错误 ITMS 90167 在包中
  • 从函数的签名中获取位置参数的名称

    使用 Python 3 x 我尝试从某个函数获取所有位置参数的名称 即 def foo a b c 1 return 现在我正在这样做 from inspect import signature empty args x for x p i
  • 使用 log4net 进行日志记录的最佳实践是什么?

    有人告诉我使用 log4net 将 日志记录 添加到我的代码中 问题是没有人可以及时旅行并查看日志记录需要用来解决哪些现实世界问题 因此 是否有一套关于记录哪些内容以获得合理的成本 收益权衡 所以 应该添加什么类型的日志记录 到一个有用的应
  • 更改 SweetAlert 上的图标图像大小

    我正在尝试更改 SweetAlert 上的图标图像大小 在 css 文件中我看到 sweet alert sa icon width 80px height 80px border 4px solid gray webkit border
  • 从 R Studio 中的 mclapply 打印

    我在 RStudio 中使用 mclapply 并希望从每个进程向控制台输出 但这似乎以某种方式被抑制 例如这里提到的 mclapply 是否保证按顺序返回其结果 https stackoverflow com questions 1469
  • 避免派生类 C++ 中的“纯虚函数调用”

    我对 C 相当陌生 所以如果这个问题的水平稍微低于这里的通常标准 我想道歉 我试图让几个类从具有虚拟函数定义的基类继承 然后我想创建一个 MainClass 数组 它可以包含所有派生类 以便输出派生 定义的虚拟功能 我收到错误 R6025
  • 检测 stdout 是否重定向到管道(而不是文件、字符设备、终端或套接字)?

    理想情况下 这可以在 shell 中编写脚本 但 Perl 或 Python 也可以 C 代码可能会有帮助 但可能不符合成本 效益 我认识到重定向到 FIFO 命名管道 可能与真实管道无法区分 这已经是我并不真正关心的边缘情况了 严格的 P
  • brew 安装 libusb 链接失败

    我正在安装libusb with brew在我的 Mac 中 酿造安装libusb 链接步骤失败 如下所示 Error The brew link step did not complete successfully The formula
  • API 级别低于 9 的 android:filterTouchesWhenObscured 的类似物

    从 API 级别 9 开始 有android filterTouchesWhenObscured属性及对应setFilterTouchesWhenObscured方法上ViewGroup 例如 当视图有onClickListener设置并且
  • 从 XMLHttpRequest 中删除 HTTP 标头

    我正在开发一个 ajax 长轮询类型应用程序 我想最大限度地减少我使用的带宽量 目前最大的成本之一是客户端 HTTP 标头 一旦我建立了连接并在客户端上存储了会话 ID 我真的不想再浪费任何带宽来传输冗余的 http 信息 例如浏览器类型
  • 使用Java根据数据库中的最大ID生成下一个ID

    我正在开发一个网络应用程序 它将有多个用户 我使用mysql作为数据库 在我的应用程序中 我正在获取最新的id from the database using max id 然后为新注册生成下一个 id 这种方法是不正确的 因为 id 可能
  • Groupby 与 min 结合,同时保留整个数据帧[重复]

    这个问题在这里已经有答案了 我想结合 groupby 和 min 但保留整个数据框 如果我使用下面的方法 我最终只会得到 2 列 即 col1 和 col2 对于这个 df col1 col2 col3 1 1 A 1 0 B 2 2 C
  • 导入 BitTorrent Bencode 模块

    我使用的是 Mac OS X 10 6 Python 是 2 6 1 我已经安装了 Bencode 模块 sudo easy install BitTorrent bencode 它出现在站点包中 Library Python 2 6 si
  • 如何有效地将体素空间聚类成尽可能少的相似、连续的块?

    我正在研究使用体素来表示大型 256x256x256 体素 战场以及服务器托管的多人游戏的可破坏地形的可行性 任何游戏一次只存在一个战场 然而 为了能够广播房间及其地形的变化 我试图找到一种算法 可以将体素分组为尽可能少的矩形块 举一个简单
  • 拖动 UITableView

    我正在开发一个 iPhone 应用程序 我想将表格视图 而不是单元格 拖动到屏幕中的某个点 我的桌面视图位于屏幕的下半部分 图像位于屏幕的上半部分 当我滚动表格查看下面的行时 表格实际上应该向上移动到图像上方 y pos 减小 高度会增加
  • 如何编写一个仅解析标签之间具有特定文本的对象的 BeautifulSoup 过滤器?

    我正在使用 Django 和 Python 3 7 我想要更有效的解析 所以我正在阅读有关 SoupStrainer 对象的内容 我创建了一个自定义的来帮助我仅解析我需要的元素 def my custom strainer self ele