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 对象如何能够将标签作为属性?的主要内容,如果未能解决你的问题,请参考以下文章