beautiful soup 在 table 中捕获空值
beautiful soup captures null values in a table
对于下面的一段HTML代码,我使用beautifulsoup来捕获table信息:
<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]
如您所见,此 table 有两个 headers: "code and display" 和一些行中的值。我的代码的预期输出应该是 [code, display, min, minutes, happy, Hour, daily, day]
但这是输出:
['Code', 'Display', 'min', 'Minute', '', 'happy ',
'Hour', '', 'daily ', 'Day', '']
输出在评论中的第 5、8 和 11 个索引中有 '',但未在此 table 中定义。我想可能是因为</td><td/>
。
如何更改代码以不在输出中捕获 u'' ?
抱歉,我没有仔细阅读您的问题。你是对的,问题是空的 <td/>
标签。只需将您的生成器调整为仅包含带有文本的单元格:
comments = [td.get_text() for td in table.findAll('td') if td.text]
编辑:我怀疑这是最有效的方法,但这只会包括第一行有文本或相应 td 的 tds。
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
]
对于下面的一段HTML代码,我使用beautifulsoup来捕获table信息:
<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]
如您所见,此 table 有两个 headers: "code and display" 和一些行中的值。我的代码的预期输出应该是 [code, display, min, minutes, happy, Hour, daily, day]
但这是输出:
['Code', 'Display', 'min', 'Minute', '', 'happy ',
'Hour', '', 'daily ', 'Day', '']
输出在评论中的第 5、8 和 11 个索引中有 '',但未在此 table 中定义。我想可能是因为</td><td/>
。
如何更改代码以不在输出中捕获 u'' ?
抱歉,我没有仔细阅读您的问题。你是对的,问题是空的 <td/>
标签。只需将您的生成器调整为仅包含带有文本的单元格:
comments = [td.get_text() for td in table.findAll('td') if td.text]
编辑:我怀疑这是最有效的方法,但这只会包括第一行有文本或相应 td 的 tds。
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
]