如何用漂亮的汤解析嵌套标签?

时间:2017-11-10 22:53:26

标签: beautifulsoup

       <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

1 个答案:

答案 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° 
相关问题