2017-11-10 120 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°