2016-05-13 2 views
1

У меня есть файл тестового отчета из Nose в формате html. Я хотел бы извлечь некоторые части текста из него на Python. Я отправлю это по электронной почте в сообщении.HTML-данные из форматирования Beautiful Soup

У меня есть следующий образец:

<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-файла.

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

Использование BeautifulSoup4 в python27 мне удалось извлечь следующее:

[<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 

Спасибо, Riaz

ответ

3

Вы можете решить с только BeautifulSoup, но я хотел бы использовать pandas и это pandas.read_html() для разбора таблицы HTML в удобное dataframe:

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, например c: \ testreport.html, потому что я буду читать из файла –

+0

@RiazLadhani заменить часть 'StringIO (data)' файлом: например. 'Pd.read_html (открытый (путь))'. Благодарю. – 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)