【问题标题】:BeautifulSoup extract contents from rows and cols from table but I am getting only one td outBeautifulSoup 从表中的行和列中提取内容,但我只得到一个 td
【发布时间】:2016-08-13 00:10:06
【问题描述】:

我正在尝试从我的 Selenium 测试报告 html 文件中提取一些数据。我从表中的一个 td 列中只得到 1 个值。 我想遍历表格并打印出行和列中的值。

我的 HTML sn-p 是:

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

请问我怎样才能得到我想要的输出?

谢谢,里亚兹

【问题讨论】:

    标签: python-2.7 beautifulsoup


    【解决方案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's 的类名,假设所有有趣的行都具有该类:

    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]]))
    

    【讨论】:

    • 坦克,这确实有效。我得到输出 Count Pass Fail Error 75 75 0 0 但随后我得到一些空白行,然后再次输出 75 75 0 0。
    • @RiazLadhani,你能分享一下实际的html吗,很可能在没有tds的表格中有中断,你当然可以使用tds = row.find_all("td")[1:-1]if tds ...但也许我们可以更具体,是否所有带有 tds 的数据行都有类 passClass
    • 您的第二种方法效果很好。我会用那个。非常感谢您的帮助。
    猜你喜欢
    • 2016-06-15
    • 2023-02-07
    • 2013-06-16
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    相关资源
    最近更新 更多