子类化 beautifulsoup html 解析器,出现类型错误

2024-01-06

我使用 beautifulsoup 很棒的 html 解析器编写了一个小包装器

最近,我尝试改进代码并使所有 beautifulsoup 方法直接在包装类中可用(而不是通过类属性),我认为子类化 beautifulsoup 解析器将是实现此目的的最佳方法。

这是该类:

class ScrapeInputError(Exception):pass
from BeautifulSoup import BeautifulSoup

class Scrape(BeautifulSoup):
    """base class to be subclassed
    basically a subclassed BeautifulSoup wrapper that providers
    basic url fetching with urllib2
    and the basic html parsing with beautifulsoup
    and some basic cleaning of head,scripts etc'"""

    def __init__(self,file):
        self._file = file
        #very basic input validation
        import re
        if not re.search(r"^http://",self._file):
            raise ScrapeInputError,"please enter a url that starts with http://"

        import urllib2
        #from BeautifulSoup import BeautifulSoup
        self._page = urllib2.urlopen(self._file) #fetching the page
        BeautifulSoup.__init__(self,self._page)
        #self._soup = BeautifulSoup(self._page) #calling the html parser

这样我就可以开始上课了

x = Scrape("http://someurl.com")

并能够使用 x.elem 或 x.find 遍历树

这对于一些 beautifulsoup 方法(见上文)效果很好,但对于其他方法却失败了 - 那些使用像“for e in x:”这样的迭代器的方法

错误消息:

 Traceback (most recent call last):
  File "<pyshell#86>", line 2, in <module>
    print e
  File "C:\Python27\lib\idlelib\rpc.py", line 595, in __call__
    value = self.sockio.remotecall(self.oid, self.name, args, kwargs)
  File "C:\Python27\lib\idlelib\rpc.py", line 210, in remotecall
    seq = self.asynccall(oid, methodname, args, kwargs)
  File "C:\Python27\lib\idlelib\rpc.py", line 225, in asynccall
    self.putmessage((seq, request))
  File "C:\Python27\lib\idlelib\rpc.py", line 324, in putmessage
    s = pickle.dumps(message)
  File "C:\Python27\lib\copy_reg.py", line 77, in _reduce_ex
    raise TypeError("a class that defines __slots__ without "
TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled

我研究了错误消息,但找不到任何可以使用的东西 - 因为我不想玩 BeautifulSoup 的内部植入(老实说,我不知道或不理解__slot__ or __getstate__..)我只想使用该功能。

我尝试从返回一个 beautifulsoup 对象,而不是子类化__init__班级的但是__init__方法返回None

很高兴在这里得到任何帮助。


BeautifulSoup 代码中没有发生该错误。相反,您的 IDLE 无法检索和打印该对象。尝试print str(e)反而。


无论如何,在您的情况下子类化 BeautifulSoup 可能不是最好的主意。你真的想继承所有的解析方法(比如convert_charref, handle_pi or error)?更糟糕的是,如果您覆盖 BeautifulSoup 使用的某些内容,它可能会以难以发现的方式损坏。

不知道你的情况,但我建议更喜欢组合而不是继承 https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance/891854#891854(即属性中有一个 BeautifulSoup 对象)。您可以轻松地(如果以一种稍微有点hacky的方式)公开像这样的特定方法:

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

子类化 beautifulsoup html 解析器,出现类型错误 的相关文章

随机推荐

  • 通过线程下载图像错误

    祝所有 StackOverFlow 会员和读者新年快乐 我今天来找你询问有关 Delphi 中线程的问题 我浏览了大部分已经发布的关于该主题的内容 但找不到线索 我有一个非常简单的测试应用程序 其中包含一个表单 frmIMGDown 和一个
  • 如何将 OPENID auth 集成到 REST api 和前端框架架构中

    我目前正在制作一个需要用户登录的网站Steam http steamcommunity com 在他们可以使用我网站的其余功能之前 Steam 目前仅支持 OPENID 进行身份验证 我的做法是按照以下步骤进行 用户按下 使用 Steam
  • python:分割字符串,用管道符号“|”分隔

    看一下下面的字符串 E 1256280 2014 01 05 17 54 00 1 2014 01 05 18 59 53 True 我想把它分开 管道符号 因此我使用以下 python 代码 其中 line 是包含上面描述的字符串的字符串
  • 在 WP7 中打开具有特定 url 的网络浏览器

    我将如何通过单击按钮时的特定网址打开网络浏览器 将以下代码放入按钮 Click 事件处理程序中 var task new Microsoft Phone Tasks WebBrowserTask URL uri task Show
  • 以编程方式添加带有按钮的视图

    我想以编程方式添加一个视图和一个按钮 如下所示 问题是单击按钮时按钮没有反应 我的意思是它既不会突出显示也不会调用选择器 原因是我想为录音 声音文件 实现一个列表行 列表行应该可以选择进行向下钻取 并有一个播放按钮 所以我得到了一个Reco
  • 将给定行移动到 DataFrame 的末尾

    我想从 DataFrame 中获取给定的行并将其添加到相同的 DataFrame 中 我下面的代码就是这样做的 但我不确定我是否以正确的方式这样做 或者是否有更简单 更好 更快的方法 testdf df copy get row targe
  • Jetpack Compose 中具有等高行的网格布局

    喷气背包组成 我想创建一个像 UI 一样具有相同高度行的网格布局 但我找不到用于获取当前可用屏幕尺寸的函数 该应用程序应该看起来像这样 https i stack imgur com TTMQb png 结果应该是这样的 看看上面提到的链接
  • 在 Kotlin 中维护重复值的两个列表的交集

    我想找到两个列表之间公共元素的数量而不消除重复项 例如 input 1 3 3 4 3 3 output 2 因为共同元素是 3 3 input 1 2 3 4 3 3 output 1 因为共同元素是 3 如果我要使用 Kotlin 集合
  • 为什么 psycopg2 和 pyodbc 连接数据库的方式不同?我该如何翻译连接?

    所以我一直在努力寻找一个好的模块来查询我公司的 POSTGRES 数据库中的信息 周围有很多模块 但我似乎只能让 pyodbc 工作 为什么 pyodbc 的连接形式与 psycopg2 不同 后者似乎是更高级的模块 我如何将连接查询从一种
  • 数组索引超出范围的二维数组

    我有一个二维数组 但没有 行数为 1 并且没有 列数 gt 1 double T new double 1 24 System out println T 1 length 但是当我打印列的长度时 它说索引超出范围 但是当我打印以下内容时
  • Android停止录音失败

    我将启动一项服务来开始录音 当我试图停止时 它显示以下消息 06 27 17 21 30 138 E MediaRecorder 6122 stop called in an invalid state 0 我不确定其他功能 例如上传数据到
  • Symfony 表单事件将错误添加到特定字段

    我的场景如下 如果用户从 maxRedemptionForDiscount 中选择 true 并在 maxRedemptionForDiscountValue 中输入 0 则应该有一条错误消息呈现到特定字段 在 TextType 字段的位置
  • 打印机忽略 javax.print.attribute.PrintRequestAttributeSet 选项

    我必须使用 javax print api 打印文件 纯文本 我能够查找打印机并提交打印作业 但我只能打印该文件的一份副本 下面是我一直在使用的代码 打印机无法识别我使用 PrintRequestAttributeSet 指定的任何选项 属
  • 安装的构建工具修订版 28.0.3 已损坏。如何修复此错误

    当我创建一个新项目时 然后构建项目或尝试在模拟器中运行应用程序 使用 sdk api level 28 Android 9 0 Pie 构建输出窗口总是显示此错误 Installed Build Tools revision 28 0 3
  • 创建新线程的测试方法以及我们从事件中获得的结果(NUnit 2.6)

    我的课程有一个公共方法Start 一个私有方法和一个事件Finishing Start call new Thread private method 私有方法使用事件返回值 当这个方法完成工作后 再调用这个事件 现在我想为这个类编写测试 如
  • BASH 脚本暂停/继续脚本内的进程

    在我正在编写的 bash 脚本中 我试图在后台启动一个进程 睡眠 然后挂起它 最后 该过程完成 由于某种原因 当我发送带有停止信号的kill命令时 它只是继续运行 就好像它没有收到任何消息一样 我可以从命令行执行此操作 但 bash 脚本未
  • 应用程序可以在 Android 和 IOS 模拟器中运行,但在发布后不能运行

    Problem 我创建了一个应用程序 它是 MQTT 代理客户端 当我使用 iOS Android 模拟器进行开发时 我与代理的连接工作正常 但是 当我发布 apk 版本时 我的应用程序无法连接 它有套接字问题 AMQJS0007E 套接字
  • 如何在Python中使用OpenSSL从pfx文件中提取密钥?

    我需要签署一份xml与certificate and key from a pfx file 换句话说 我有一个 pfx 文件 我需要从其中提取pem an key签署我的xml 我发现这个脚本可以从 pfx 中提取笔和密钥 但出现错误 i
  • 任意多边形的宽度

    我需要一种方法来表征二维点集的大小 这样我就可以根据视口的比例来确定是否将它们渲染为空间中的单个点或代表性多边形 我已经有一个算法来计算该集合的凸包以生成代表性多边形 但我需要一种方法来表征其大小 一个明显的衡量标准是凸包上点之间的最大距离
  • 子类化 beautifulsoup html 解析器,出现类型错误

    我使用 beautifulsoup 很棒的 html 解析器编写了一个小包装器 最近 我尝试改进代码并使所有 beautifulsoup 方法直接在包装类中可用 而不是通过类属性 我认为子类化 beautifulsoup 解析器将是实现此目