beautifulsoup 对象如何能够将标签作为属性?

Posted

技术标签:

【中文标题】beautifulsoup 对象如何能够将标签作为属性?【英文标题】:How beautifulsoup objects able to have a tag as an attribute? 【发布时间】:2022-01-12 10:20:19 【问题描述】:

为了提取标签,您需要将标签用作Tag/BeautifulSoup对象的属性,例如要提取<head> 标签,我需要这样做soupobject.head

我仍然是编程和 python 的初学者,但根据我的理解和快速的谷歌搜索,对象属性是属于该对象的变量。我的意思是我可以编写一个脚本,它有一个名为p 的变量,并且有一个条件,当我的脚本运行时,如果它找到一个<p> 标记,它将解析其中的任何相关数据,然后将其分配给@ 987654327@ 变量我做了,但是要写一个脚本,它本身会“定义”一个变量,并根据我不知道的html标签名称命名它。

我希望我已经解释得够多了。我试图理解 beautifulsoup 源代码,但老实说,我仍然无法理解其中的大部分内容。

关于它如何做到这一点,我唯一的假设/理论是通过创建 python 代码的字符串格式然后导入它,我不知道这是否可能

【问题讨论】:

你能提供一些你想要达到的目标的例子吗? 【参考方案1】:

通过__getattr__()__getattribute__() 魔术方法查看data model class customization via special methods,尤其是customizing attribute access

在这种特殊情况下 (bs4),您可以查看 Tag 类的 bs4 源代码,其中定义了 Tag.__getattr__() magic method。注意BeautifulSoup class inherits from Tag

也不是soup.head 不是访问head 标签的唯一方法。你可以做soup.find('head')——这正是他们在Tag.__getattr__()所做的。

举例说明

class Foo:
    def __init__(self):
        self.spam = 'spam'

    def __getattr__(self, name):
        return f'Attribute "name" returned from __getattr__'

foo = Foo()
print(foo.spam)
print(foo.eggs)

输出:

spam
Attribute "eggs" returned from __getattr__

【讨论】:

我用一个例子扩展了我的答案。【参考方案2】:

一般来说,使用可变变量名并不是一个好习惯。有些语言甚至无法做到这一点。为了达到同样的目的,你可以使用一个字典对象,它可以有可变的键名和可变的值。

my_dict = 'key_1': 'value 1'
print(my_dict['key_1'])
# out: 'value 1'

my_dict['some_key'] = 'another value'
# now your dictionary looks like this: 
# 'key_1': 'value 1', 'some_key': 'another value'
print(my_dict['some_key'])
# out: 'another value'

# as for dynamic names:
some_name = 'key_3'
my_dict[some_name] = 'value 3'
print(my_dict)
# out: 'key_1': 'value 1', 'some_key': 'another value', 'key_3': 'value 3'

【讨论】:

以上是关于beautifulsoup 对象如何能够将标签作为属性?的主要内容,如果未能解决你的问题,请参考以下文章

爬虫:BeatifulSoup模块

怎么使用beautifulsoup获取指定div标签内容

如何将 BeautifulSoup 标签转换为 JSON?

如何识别beautifulsoup返回的'p'标签中是否存在'span'子标签?

Beautifulsoup4

如何让 beautifulsoup 对脚本标签的内容进行编码和解码