2013-06-13 82 views
-1

考虑:__dict __项目()没有返回所有对象的属性

>>> result = requests.get('http://dotancohen.com') 
>>> soup = BeautifulSoup(result.text) 
>>> a = soup.find('a') 
>>> for k,v in a.__dict__.items(): 
...  print(str(k)+": "+str(v)) 
... 
can_be_empty_element: False 
previous_element: <h1><a class="title" href="/">Dotan Cohen</a></h1> 
next_sibling: None 
name: a 
parent: <h1><a class="title" href="/">Dotan Cohen</a></h1> 
namespace: None 
prefix: None 
previous_sibling: None 
attrs: {'href': '/', 'class': ['title']} 
next_element: Dotan Cohen 
parser_class: <class 'bs4.BeautifulSoup'> 
hidden: False 
contents: ['Dotan Cohen'] 
>>> pprint(a) 
<a class="title" href="/">Dotan Cohen</a> 
>>> 

的值pprint的回报是不是任何属性,这些属性__dict__.items()回报的价值。这对我来说意味着的属性不会在__dict__.items()中返回。我怎样才能访问这些属性?

+2

你为什么假设'str()'表示应该匹配实例属性? 'attrs'在那里,以及'contents'和'name',所以你在字符串表示中看到的所有内容都可以在实例属性中找到。 –

+0

@MartijnPieters:'repr'而不是'str',但你的观点站立! –

+0

@MartijnPieters:我同意在字符串表示中看到的所有内容都可以在实例属性中找到。但请注意,信息位于属性'previous_element'和'parent'中。标签本身的实际内容未显示。但是,它必须作为'pprint()'找到它存储_somewhere_!那么为什么它不会在'__dict __。items()'中返回呢? – dotancohen

回答

2

实例字典中没有缺失属性。让我们来看看元素的表示:

<a class="title" href="/">Dotan Cohen</a> 

我们有一个标签名(a),属性(titlehref,其值),我们有文本内容(Dotan Cohen)。这些都是所有出现在实例属性您列出:

  • name: a
  • attrs: {'href': '/', 'class': ['title']}
  • contents: ['Dotan Cohen']

contents是这个元素的直接后裔的名单;只有一个,文本对象(NavigableString实例使用看起来就像一个常规字符串)。可以使用vars() built-in API function来列出实例属性。我看到你已经在使用pprint();而不是循环使用.items(),只需使用pprint(vars(a))并保存您输入的完整循环;作为奖金pprint()排序项第一:

>>> pprint(vars(a)) 
{'attrs': {'class': ['title'], 'href': '/'}, 
'can_be_empty_element': False, 
'contents': [u'Dotan Cohen'], 
'hidden': False, 
'name': 'a', 
'namespace': None, 
'next_element': u'Dotan Cohen', 
'next_sibling': None, 
'parent': <h1><a class="title" href="/">Dotan Cohen</a></h1>, 
'parser_class': <class 'bs4.BeautifulSoup'>, 
'prefix': None, 
'previous_element': <h1><a class="title" href="/">Dotan Cohen</a></h1>, 
'previous_sibling': None} 

你正在寻找由.__repr__()挂钩的元素类的内置的字符串:

>>> a.__repr__() 
'<a class="title" href="/">Dotan Cohen</a>' 

repr()上的使用通常被称为object:

>>> repr(a) 
'<a class="title" href="/">Dotan Cohen</a>' 

该字符串是根据您在对象属性中看到的已分析元素信息构建的。

+0

从我的理解你的解释,标签的实际返回值没有存储在任何地方?这意味着'pprint()'返回的值必须由某种'ToString()'方法来完成。我可以通过查看解析的网站的源代码来确认,HTML中的属性顺序与'pprint()'返回的字符串中的属性顺序不同。 – dotancohen

+1

是的,您正在查看对象的'repr()'结果。 '__repr__'方法负责从属性数据构建。 HTML属性没有排序(如Python字典)。 –

+0

我明白了,谢谢Martijn。从谷歌搜索了一下,我发现存在一个'dir()'方法,它将返回'a'的所有'名称',其中之一是'__repr__'。 'a .__ repr__'确实返回'<绑定方法标签.__ unicode__的Dotan Cohen>''。但是,除了“名称是:变量,模块,函数等”之外,我很难找到“名称”这个词的定义。 – dotancohen

相关问题