2016-05-31 58 views
0

对于下面的一段HTML代码捕获空值,我用beautifulsoup捕捉表信息:美丽的汤在一个表中

<table> 
<tr> 
<td><b>Code</b></td> 
<td><b>Display</b></td> 
</tr> 
<tr> 
<td>min</td> 
<td>Minute</td><td/> 
</tr> 
<tr> 
<td>happy </td> 
<td>Hour</td><td/> 
</tr> 
<tr> 
<td>daily </td> 
<td>Day</td><td/> 
</tr> 

这是我的代码:

comments = [td.get_text() for td in table.findAll("td")] 
Comments=[data.encode('utf-8') for data in comments] 

正如你看到的,该表有两个标题:“代码和显示”和一些行中的值。我的代码的期望输出应该是[代码,显示,分,分,快乐,小时,日,日]

但这是输出:

['Code', 'Display', 'min', 'Minute', '', 'happy ', 
'Hour', '', 'daily ', 'Day', ''] 

输出有“”在5日,第八和第十一个评论指数在本表中没有定义。我认为这可能是因为</td><td/>。 如何更改代码以便在输出中不捕获u''?

+0

@Noah,我的问题不是'你'。这是你在输出列表中。 '代码= [data.encode('utf-8')for data in comments]',这是输出:['Code','Display','min' ,'分钟','','快乐','小时','','每日','日',''],你能​​看到第5和第10个指数的额外产出吗? – Mary

回答

1

对不起,我没有仔细阅读你的问题。你是对的,问题是空的<td/>标签。只要调整您的发电机,只包括细胞的文字:

comments = [td.get_text() for td in table.findAll('td') if td.text] 


编辑:我怀疑这是做的最有效的方式,但这样只会包括TDS具有文本或相应的TD在第一行。

ths = table.tr.find_all('td') 
tds_in_row = len(table.tr.next_sibling.find_all('td')) 

tds = [ 
    td.get_text() 
    for i, td in enumerate(table.find_all('td')) 
    if len(ths) > (i + 1) % tds_in_row or td.text 
] 
+0

非常感谢! – Mary

+0

对不起诺亚,你能给我另一个解决方案吗?因为如果我使用您提供的代码,它不会捕获我真正想要捕获它们的一些空值(例如用于在其他表中显示)。你认为我可以从表格标签中删除吗? – Mary

+0

您可以举例说明您何时会不想保留这些值吗?例如,在以下url中, – Noah