【问题标题】:Parsing HTML Tables with BeautifulSoup用 BeautifulSoup 解析 HTML 表格
【发布时间】:2011-05-10 11:47:33
【问题描述】:

我过去使用过 BeautifulSoup,但我遇到了一些新的问题;令人难以置信的通用/最小 HTML 表格标记...我的目标是获取每个值和它的标签(每个都有自己的 td)并将它们打印出来...它们可以合并,我不在乎,我只是想做确保每个标签都应用于正确的值。这是一个示例表:

<tbody><tr>
<td class="labels">Dawn:</td>
<td class="site_data" style="text-align: left;">07:01</td>
<td class="labels">Sunrise:</td>
<td class="site_data" style="text-align: left;">07:26</td>
<td class="labels">Moonrise:</td>
<td class="site_data" style="text-align: left;">14:29</td>
<td rowspan="3"><img src="images/moon.bmp" alt="Moon" width="64" align="left" border="0" height="64" style="margin: 0px 10px" /></td>
</tr>
<tr>
<td class="labels">Dusk:</td>
<td class="site_data" style="text-align: left;">18:27</td>
<td class="labels">Sunset:&nbsp;</td>
<td class="site_data" style="text-align: left;">18:02</td>
<td class="labels">Moonset:</td>
<td class="site_data" style="text-align: left;">01:55</td>
</tr>
<tr>
<td class="labels">Daylight:</td>
<td class="site_data" style="text-align: left;">11:26</td>
<td class="labels">Day length:</td>
<td class="site_data" style="text-align: left;">10:36</td>
<td class="labels">Moon Phase:</td>
<td class="site_data" style="text-align: left;">Waxing Gibbous</td>
</tr>
</tbody>

我知道如何获取这些值...

for td in soup.findAll('table')[0]:  # theres more than one table on the page
    print td.renderContents().strip()

但这只会给我....

'Dawn:'
'07:01'
'Sunrise:'
'07:26'
'Moonrise:'
'14:29'
'<img src="images/moon.bmp" alt="Moon" width="64" align="left" border="0" height="64" style="margin: 0px 10px" />'
'Dusk:'
'18:27'
'Sunset:&nbsp;'
'18:02'
'Moonset:'
'01:55'
'Daylight:'
'11:26'
'Day length:'
'10:36'
'Moon Phase:'
'Waxing Gibbous'

我想我可以抓住那些类值“标签”和“站点数据”,但我如何确保标签和数据被正确分组?

【问题讨论】:

    标签: python beautifulsoup html-table


    【解决方案1】:

    以下内容应该更简单易懂:

    import pprint
    from BeautifulSoup import BeautifulSoup  
    soup = BeautifulSoup(docTxt)
    groupedData = []
    for row in soup.findAll("tr"):
        data = {}
        allTDs = row.findAll("td")
        for x in range(0, len(allTDs)-1, 2):
            data[allTDs[x].renderContents().strip()] = allTDs[x+1].renderContents().strip()
        groupedData.append(data)
    
    pprint.pprint(groupedData)
    

    输出:

    [{'Dawn:': '07:01', 'Moonrise:': '14:29', 'Sunrise:': '07:26'},
     {'Dusk:': '18:27', 'Moonset:': '01:55', 'Sunset:&nbsp;': '18:02'},
     {'Day length:': '10:36',
      'Daylight:': '11:26',
      'Moon Phase:': 'Waxing Gibbous'}]
    

    【讨论】:

      【解决方案2】:

      我不是 BeautifulSoup 专家,但您可以尝试以下方法:

      for label in soup.findAll('table')[0].findAll('td', attrs={'class' : 'labels'}):
        data_sibs = label.findNextSiblings(attrs={'class' : 'site_data'})
        if len(data_sibs) > 0:
          print label.renderContents().strip() + " " + data_sibs[0].renderContents().strip()
      

      编辑:

      测试并产生以下结果:

      Dawn: 07:01
      Sunrise: 07:26
      Moonrise: 14:29
      
      etc..
      

      【讨论】:

        猜你喜欢
        • 2014-09-03
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 2017-02-15
        • 2012-01-12
        • 1970-01-01
        • 2012-12-13
        相关资源
        最近更新 更多