<div class="t m0 x1c h4 y10f ff2 fs2 fc0 sc0 ls0 ws0">
Kne e
<span class="_ _72">
</span>
<span class="ff3">
102.2°
<span class="_ _8">
</span>
97.5°
<span class="_ _4e">
</span>
99.8°
</span>
</div>
<div class="t m0 xd h4 y110 ff2 fs2 fc0 sc0 ls0 ws0">
A n k l e
<span class="_ _7d">
</span>
<span class="ff3">
46.0°
<span class="_ _17">
</span>
46.3°
<span class="_ _4e">
</span>
33.5°
</span>
</div>
我有一个大型HTML文件,如上所示。它包含嵌套的div
(我只是在我的示例中剪切了2层嵌套的div)。
属性class
名称是随机生成的,因此我无法解析特定的div。
我正在使用Beatiful Soup 4将数据从html拉到纯文本文件,但是我想输出它很好,正如我的例子所示,它是一行有4列,我想要输出如knee 102.2° 97.5° 99.8°
,然后下一行是Ankle的列。
下面我打印出所有div
的类属性名称,我观察到第一个是父级,其余的是子级。如何逐个格式化子div
文本?在示例中显示的父子项只是我的html的一部分,它也被其他div嵌套,谢谢!
['t', 'm0', 'xd', 'h4', 'y118', 'ff2', 'fs2', 'fc0', 'sc0', 'ls0', 'ws0'] --> parent div
['t', 'm0', 'x37', 'h3', 'y119', 'ff2', 'fs1', 'fc0', 'sc0', 'ls0', 'ws0']
['t', 'm0', 'x39', 'h4', 'y11a', 'ff2', 'fs2', 'fc0', 'sc0', 'ls0', 'ws0']
['t', 'm0', 'x52', 'h4', 'y11b', 'ff2', 'fs2', 'fc0', 'sc0', 'ls0', 'ws0']
['t', 'm0', 'x11', 'h4', 'y11c', 'ff2', 'fs2', 'fc0', 'sc0', 'ls0', 'ws0']
['t', 'm0', 'x1c', 'h4', 'y11d', 'ff2', 'fs2', 'fc0', 'sc0', 'ls0', 'ws0']
['t', 'm0', 'x1c', 'h4', 'y11e', 'ff2', 'fs2', 'fc0', 'sc0', 'ls0', 'ws0']
['t', 'm0', 'x54', 'h4', 'y11f', 'ff2', 'fs2', 'fc0', 'sc0', 'ls0', 'ws0']
['t', 'm0', 'x11', 'h4', 'y120', 'ff2', 'fs2', 'fc4', 'sc0', 'ls0', 'ws0'] --> this is the knee div
['t', 'm0', 'x1c', 'h4', 'y121', 'ff2', 'fs2', 'fc5', 'sc0', 'ls0', 'ws0'] --> this is ankle div
答案 0 :(得分:1)
在这种情况下,如果没有类名,您可以使用css selectors来匹配标记模式。
如果父标记是<div>
,您可以使用soup.select('div > div')
获取子节点<div>
并提取文本。
可能需要在此选择器中添加更多标签,具体取决于html代码。
一个工作示例:
from bs4 import BeautifulSoup as soup
html = """
<div>
<div class="t m0 x1c h4 y10f ff2 fs2 fc0 sc0 ls0 ws0">
Kne e
<span class="_ _72">
</span>
<span class="ff3">
102.2°
<span class="_ _8">
</span>
97.5°
<span class="_ _4e">
</span>
99.8°
</span>
</div>
<div class="t m0 xd h4 y110 ff2 fs2 fc0 sc0 ls0 ws0">
A n k l e
<span class="_ _7d">
</span>
<span class="ff3">
46.0°
<span class="_ _17">
</span>
46.3°
<span class="_ _4e">
</span>
33.5°
</span>
</div>
</div>
"""
soup = soup(html, 'lxml')
result = soup.select('div > div')
for res in result:
print(res.get_text().replace(' ','').replace('\n',' '))
# >>> Knee 102.2° 97.5° 99.8°
# Ankle 46.0° 46.3° 33.5°