2016-05-13 21 views
1

NoseのテストレポートファイルがHTML形式です。 Pythonでテキストの一部を抽出したいと思います。私はメッセージ部の電子メールでこれを送信します。Beautiful SoupからのHTMLデータには書式設定が必要

私は次のサンプルがあります。私は、ブラウザでファイルを開く場合は

<table> 
     <tr> 
      <th>Class</th> 
      <th class="failed">Fail</th> 
      <th class="failed">Error</th> 
      <th>Skip</th> 
      <th>Success</th> 
      <th>Total</th> 
     </tr> 
      <tr> 
       <td>Regression_TestCase</td> 
       <td class="failed">1</td> 
       <td class="failed">9</td> 
       <td>0</td> 
       <td>219</td> 
       <td>229</td> 
      </tr> 
     <tr> 
      <td><strong>Total</strong></td> 
      <td class="failed">1</td> 
      <td class="failed">9</td> 
      <td>0</td> 
      <td>219</td> 
      <td>229</td> 
     </tr> 
    </table> 

をフォーマットは私がしたいテキストを次のようになります。これは、私はhtmlファイルから抽出したいテキストです。

私は次のように抽出するために管理しているPython27でBeautifulSoup4を使用して
Class    Fail Error Skip Success  Total 
Regression_TestCase  1 9  0  219   229 

次のように

[<th>Class</th>, <th class="failed">Fail</th>, <th class="failed">Error</th>, <th>Skip</th>, <th>Success</th>, <th>Total</th>] 

[<td>Regression_TestCase.RegressionProject_TestCase2.RegressionProject_TestCase2</td>, <td class="failed">1</td>, <td class="failed">9</td>, <td>0</td>, <td>219</td>, <td>229</td>, <td><strong>Total</strong></td>, <td class="failed">1</td>, <td class="failed">9</td>, <td>0</td>, <td>219</td>, <td>229</td>] 

私のコードは次のとおりです。

def extract_pass_summary_from_selenium_report(): 
    html_report = open(r"C:\test_runners\selenium_regression_test_5_1_1\ClearCore 501 - Regression Test\TestReport\SeleniumTestReport.html",'r').read() 
    soup = BeautifulSoup(html_report, "html.parser") 

    print soup.find_all('th') 

    print soup.find_all('td') 

どのように私はテキストを抽出し、書式設定を維持することができますこのような:?

Class    Fail Error Skip Success  Total 
Regression_TestCase  1 9  0  219   229 

おかげで、リアズ

答えて

3

は、あなただけではBeautifulSoupでそれを解決することができますが、私はpandasを使うだろうし、それが便利なデータフレームの中にHTMLテーブルを解析するpandas.read_html()です:

from StringIO import StringIO 

import pandas as pd 

data = """ 
<table> 
     <tr> 
      <th>Class</th> 
      <th class="failed">Fail</th> 
      <th class="failed">Error</th> 
      <th>Skip</th> 
      <th>Success</th> 
      <th>Total</th> 
     </tr> 
      <tr> 
       <td>Regression_TestCase</td> 
       <td class="failed">1</td> 
       <td class="failed">9</td> 
       <td>0</td> 
       <td>219</td> 
       <td>229</td> 
      </tr> 
     <tr> 
      <td><strong>Total</strong></td> 
      <td class="failed">1</td> 
      <td class="failed">9</td> 
      <td>0</td> 
      <td>219</td> 
      <td>229</td> 
     </tr> 
    </table>""" 

df = pd.read_html(StringIO(data)) 
print(df) 

プリント:

[      0  1  2  3  4  5 
0    Class Fail Error Skip Success Total 
1 Regression_TestCase  1  9  0  219 229 
2    Total  1  9  0  219 229] 
+0

あなたのコードに感謝を関数を呼び出すために、私は、例えば、レポートhtmlファイルへのパスでデータを交換することができます@RiazLadhaniは 'StringIO(data)'部分をファイルオブジェクトで置き換えます。例えば、ファイル: –

+0

から読み込みます。 'pd.read_html(open(path))'です。ありがとう。 – alecxe

0

関数を追加

def html_to_text(html): 
    records = [] 
    for i in range(len(html)): 
     html[i] = html[i].text 
     records.append(html[i]) 
    return records 

ths = soup.find_all('th') 
ths = html_to_text(ths) 
print(ths) 
tds = html_to_text(soup.find_all('td')) 
print(tds) 
関連する問題