2016-05-14 4 views
1

Ich habe die folgende Beispiel-HTML-Tabelle aus einer HTML-Datei.BeautifulSoup meine for-Schleife druckt alle Daten aus dem td-Tag. Ich möchte den letzten Abschnitt des td-Tags ausschließen

<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.RegressionProject_TestCase2.RegressionProject_TestCase2</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> 

Ich versuche, den Text aus den <td> Tags zu drucken, wo <td> beginnt ab: Regression_TestCase.RegressionProject_TestCase2.RegressionProject_TestCase2

Ich will nicht den Text aus den <td> Tags aufzunehmen, wo <td> beginnt ab:

<td><strong>Total</strong></td> 

Mein Code den Text aus jedem einzelnen <td> Tag druckt:

def extract_data_from_report(): 
    html_report = open(r"E:\SeleniumTestReport.html",'r').read() 
    soup = BeautifulSoup(html_report, "html.parser") 
    th = soup.find_all('th') 
    td = soup.find_all('td') 

    for item in th: 
     print item.text, 
    print "\n" 
    for item in td: 
     print item.text, 

Meine gewünschte Ausgabe:

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

Antwort

1

Sie können alle Zeilen finden (tr Elemente) außer dem ersten (um die Header zu überspringen) und die letzte - die „total“ Reihe. Beispielimplementierung, die eine Liste von Wörterbüchern als Ergebnis produziert:

from pprint import pprint 

from bs4 import BeautifulSoup 


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.RegressionProject_TestCase2.RegressionProject_TestCase2</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>""" 

soup = BeautifulSoup(data, "html.parser") 

headers = [header.get_text(strip=True) for header in soup.find_all("th")] 
rows = [dict(zip(headers, [td.get_text(strip=True) for td in row.find_all("td")])) 
     for row in soup.find_all("tr")[1:-1]] 

pprint(rows) 

Drucke:

[{u'Class': u'Regression_TestCase.RegressionProject_TestCase2.RegressionProject_TestCase2', 
    u'Error': u'9', 
    u'Fail': u'1', 
    u'Skip': u'0', 
    u'Success': u'219', 
    u'Total': u'229'}] 
+0

Das ist großartig. Vielen Dank. Wie kann ich den ganzen Text auf eine Zeile setzen? Die Nummern auf der nächsten neuen Zeile. Die Zahlen sollten unter jedem Text sein. Z.B. 9 sollte unter Fehler sein. 1 sollte unter Fail sein. –

+0

@RiazLadhani okay, könnten Sie ein Beispiel gewünschte Ausgabe liefern? Vielen Dank. – alecxe

+0

Bitte sehen Sie meine Frage. Ich habe die gewünschte Ausgabe am Ende meiner Frage geändert. Vielen Dank. –

Verwandte Themen