为什么在BeautifulSoup中发生属性拆分?

时间:2019-07-15 17:44:48

标签: python-3.x beautifulsoup

我尝试获取父元素的属性:

<div class="detailMS__incidentRow incidentRow--away odd">
    <div class="time-box">45'</div>
    <div class="icon-box soccer-ball-own"><span class="icon soccer-ball-own">&nbsp;</span></div>
    <span class=" note-name">(Autogoal)</span><span class="participant-name">
        <a href="#" onclick="window.open('/player/reynaldo/CxtEEPzE/'); return false;">Reynaldo</a>
    </span>
</div>
span_autogoal = soup.find('span', class_='note-name')
print(span_autogoal)
print(span_autogoal.find_parent('div')['class'])
# print(span_autogoal.find_parent('div').get('class')

输出:

<span class="note-name">(Autogoal)</span>
['detailMS__incidentRow', 'incidentRow--away', 'odd']

我知道我可以做这样的事情:

print(' '.join(span_autogoal.find_parent('div')['class']))

但是我想知道为什么会这样,并且有可能更正确地做到这一点吗?

2 个答案:

答案 0 :(得分:2)

以上答案是正确的,但是,如果要获取多属性值作为字符串返回,请尝试在获取父元素之后使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <div id="HTMLdy"></div> <button id="gen">Generate Anchor Tag</button>解析器。

xml

控制台上的输出:

from bs4 import BeautifulSoup

data='''<div class="detailMS__incidentRow incidentRow--away odd">
    <div class="time-box">45'</div>
    <div class="icon-box soccer-ball-own"><span class="icon soccer-ball-own">&nbsp;</span></div>
    <span class=" note-name">(Autogoal)</span><span class="participant-name">
        <a href="#" onclick="window.open('/player/reynaldo/CxtEEPzE/'); return false;">Reynaldo</a>
    </span>
</div>'''
soup=BeautifulSoup(data,'lxml')
span_autogoal = soup.find('span', class_='note-name')
print(span_autogoal)
parentdiv=span_autogoal.find_parent('div')

data=str(parentdiv)

soup=BeautifulSoup(data,'xml')
print(soup.div['class'])

答案 1 :(得分:1)

根据BeautifulSoup documentation

  

HTML 4定义了一些可以具有多个值的属性。 HTML 5   删除其中的几个,但定义更多。最常见的   多值属性是类(即,标记可以具有多个   CSS类)。其他包括rel,rev,accept-charset,header和   快捷键。 美丽汤展示了多值食品的价值   属性作为列表

css_soup = BeautifulSoup('<p class="body"></p>') css_soup.p['class']
# ["body"]

css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.p['class']
# ["body", "strikeout"]

因此,在您的情况下,<div class="detailMS__incidentRow incidentRow--away odd">中的class属性是多值

这就是span_autogoal.find_parent('div')['class']为您提供list作为输出的原因。