2017-11-10 74 views
0
 <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 s(我只是在我的例子中剪切了一个2层嵌套的div)。 属性class名称是随机生成的,因此我无法解析特定的div。如何用美丽的汤解析嵌套标签?

我正在使用美丽汤4将数据从HTML拉到纯文本文件,它工作正常,但我想很好地输出它,如我的示例所示,它是一行4列,我想使输出为knee 102.2° 97.5° 99.8°,然后下一行是脚踝的列。

下面我打印出所有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

在这种情况下,如果没有类名称,您可以使用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°