BeautifulSoup从表中的行和列中提取内容,但我只得到一个td

时间:2016-08-12 15:33:14

标签: python-2.7 beautifulsoup

我正在尝试从我的Selenium Test Report html文件中提取一些数据。我从表中的一个td列中只得到1个值。 我想迭代表并打印出行和列中的值。

我的HTML代码段是:

<table id='result_table'>
<colgroup>
<col align='left' />
<col align='right' />
<col align='right' />
<col align='right' />
<col align='right' />
<col align='right' />
</colgroup>
<tr id='header_row'>
    <td>Test Group/Test case</td>
    <td>Count</td>
    <td>Pass</td>
    <td>Fail</td>
    <td>Error</td>
    <td>View</td>
</tr>

<tr class='passClass'>
    <td>Regression_TestCase.RegressionProjectEdit_TestCase.RegressionProject_TestCase_Project_Edit</td>
    <td>75</td>
    <td>75</td>
    <td>0</td>
    <td>0</td>
    <td><a href="javascript:showClassDetail('c1',75)">Detail</a></td>
</tr>

我想要的输出格式是:

Count   Pass    Fail    Error   
75      75      0       0       

我的代码是:

table = soup.find('table', {'id': 'result_table'})
tr = table.find('tr', {'id': 'header_row'})
td = tr.findNext('td')
for item in td:
    print td, "\t",
print "\n"

我得到的输出是:

<td>Test Group/Test case</td>   

我怎样才能获得所需的输出?

谢谢Riaz

1 个答案:

答案 0 :(得分:1)

只需按id获取表格,然后提取行并找到td标签,将第二个切换到倒数第二个:

   In [40]: from bs4 import BeautifulSoup    
   In [41]: soup = BeautifulSoup(html, "html.parser")  
   # can use .find(id="result_table")  
   In [42]: table = soup.select_one("#result_table")  


   In [45]: for row in table.find_all("tr"):
      ....:     print(" ".join([td.text for td in row.find_all("td")[1:-1]]))
      ....:     
   Count Pass Fail Error  
   75 75 0 0

table.find('tr', {'id': 'header_row'})只会选择示例中的第一个tr,然后tr.findNext('td')只能获得 header_row tr 之后的第一个td,以便这就是为什么你只看到测试组/测试用例

另一种方法是使用 tr 的类名,假设所有有趣的行都有该类:

soup = BeautifulSoup(html, "html.parser")
table = soup.select_one("#result_table")
headers= [td.text for td in table.select_one("#header_row").find_all("td")[1:-1]]
print(" ".join(headers))
for row in table.select("tr.passClass"):
    print(" ".join([td.text for td in row.find_all("td")[1:-1]]))