2014-01-09 2 views
0

Мне нужно извлечь значение из таблицы html, которую можно захватить с веб-сервера в txt-файле. Точное требование состоит в том, чтобы извлечь последнее временное время чтения в переменную.BeautifulSoup Python - Проблемы с таблицами HTML

Форматирование этой таблицы не идеально, я думаю.

Вот пример HTML кода для таблицы ...

<table border="1" rules="all"> 
<col /> 
<col /> 
    <col align="char" char="." /> 
    <col align="char" char="." /> 
    <col /> 
    <col /> 
    <col align="char" char="m" /> 
    <col align="char" char="m" /> 
    <col align="char" char="." /> 
    <col align="char" char="," /> 
    <tr> 
    <th colspan="2" rowspan="2">Date &amp; time</th> 
    <th rowspan="2">Temp</th> 
    <th rowspan="2">Feels like</th> 
    <th rowspan="2">Humidity</th> 
    <th colspan="3">Wind</th> 
    <th rowspan="2">Rain</th> 
    <th rowspan="2">Pressure</th> 
    </tr> 
    <tr> 
    <th>dir</th> 
    <th>ave</th> 
    <th>gust</th> 
    </tr> 
    <tr> 
    <td>2014/01/08</td> 
    <td>1056 GMT</td> 
    <td>11.0 &deg;C</td> 
    <td>9.8 &deg;C</td> 
    <td>74%</td> 
    <td>NNW</td> 
    <td>1 mph</td> 
    <td>6 mph</td> 
    <td>0.3 mm</td> 
    <td>1032.4 hPa, rising</td> 
    </tr> 
    <tr> 
    <td></td> 
    <td>1159 GMT</td> 
    <td>10.8 &deg;C</td> 
    <td>9.7 &deg;C</td> 
    <td>74%</td> 
    <td>SSE</td> 
    <td>1 mph</td> 
    <td>4 mph</td> 
    <td>0.0 mm</td> 
    <td>1032.0 hPa, rising slowly</td> 
    </tr> 
    <tr> 
    <td></td> 
    <td>1258 GMT</td> 
    <td>11.0 &deg;C</td> 
    <td>9.9 &deg;C</td> 
    <td>73%</td> 
    <td>SSE</td> 
    <td>1 mph</td> 
    <td>4 mph</td> 
    <td>0.0 mm</td> 
    <td>1031.5 hPa, falling slowly</td> 
    </tr> 
    <tr> 
    <td></td> 
    <td>1357 GMT</td> 
    <td>10.8 &deg;C</td> 
    <td>9.7 &deg;C</td> 
    <td>75%</td> 
    <td>SSW</td> 
    <td>1 mph</td> 
    <td>4 mph</td> 
    <td>0.0 mm</td> 
    <td>1030.7 hPa, falling</td> 
    </tr> 
    <tr> 
    <td></td> 
    <td>1456 GMT</td> 
    <td>10.3 &deg;C</td> 
    <td>9.3 &deg;C</td> 
    <td>77%</td> 
    <td>ENE</td> 
    <td>1 mph</td> 
    <td>4 mph</td> 
    <td>0.0 mm</td> 
    <td>1030.0 hPa, falling</td> 
    </tr> 
    <tr> 
    <td></td> 
    <td>1600 GMT</td> 
    <td>9.7 &deg;C</td> 
    <td>8.7 &deg;C</td> 
    <td>81%</td> 
    <td>WNW</td> 
    <td>1 mph</td> 
    <td>3 mph</td> 
    <td>0.0 mm</td> 
    <td>1028.7 hPa, falling</td> 
    </tr> 
    <tr> 
    <td></td> 
    <td>1658 GMT</td> 
    <td>8.9 &deg;C</td> 
    <td>7.9 &deg;C</td> 
    <td>86%</td> 
    <td>NNE</td> 
    <td>1 mph</td> 
    <td>4 mph</td> 
    <td>0.0 mm</td> 
    <td>1026.9 hPa, falling quickly</td> 
    </tr> 
</table> 

Я следующий код питона, который помещает все данные в строки

#!/usr/bin/python 
from BeautifulSoup import BeautifulSoup 
import urllib2 
data = "http://****************/weather_station/data/6hrs.txt" 
req = urllib2.Request(data) 
page = urllib2.urlopen(req) 
soup = BeautifulSoup(page) 

table = soup.find('table') 
for row in table.findAll('tr'): 
     col = row.findAll('td') 
#  time = col[0].string 
#  temp = col[1].string 

print col 

Это где я застрял. Время = col [0] .string возвращает индекс списка ошибок вне диапазона, подразумевая, что в списке ничего нет, но если я печатаю col, он отображает данные, которые я хочу извлечь.

Любые предложения?

Ответ ниже подходит для этой таблицы. Я также хотел бы получить те же данные из таблицы, как это ...

<table border="1" rules="rows" cellspacing="0" cellpadding="5"> 
    <col /> 
    <col /> 
    <col align="char" char="." /> 
    <col align="char" char="." /> 
    <col /> 
    <col /> 
    <col align="char" char="m" /> 
    <col align="char" char="m" /> 
    <col align="char" char="." /> 
    <col align="char" char="," /> 
    <tr> 
    <th rowspan="2">Time</th> 
    <th rowspan="2">Temp</th> 
    <th rowspan="2">Feels like</th> 
    <th rowspan="2">Humidity</th> 
    <th colspan="3">Wind</th> 
    <th rowspan="2">Rain</th> 
    <th rowspan="2">Pressure</th> 
    </tr> 
    <tr> 
    <th>dir</th> 
    <th>ave</th> 
    <th>gust</th> 
    </tr> 
<tr> 
<td>12:45 <small>GMT:</small></td> 
<td>8.8<small>C</small></td> 
<td>7.1 <small>&deg;C</small></td> 
<td>66<small>%</small></td> 
<td>W </td> 
<td>1 <small>mph</small></td> 
<td>2 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1022 <small>hPa</small></td> 
</tr> 
<tr> 
<td>12:40 <small>GMT:</small></td> 
<td>8.9<small>C</small></td> 
<td>6.9 <small>&deg;C</small></td> 
<td>66<small>%</small></td> 
<td>SE </td> 
<td>2 <small>mph</small></td> 
<td>4 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1022 <small>hPa</small></td> 
</tr> 
<tr> 
<td>12:34 <small>GMT:</small></td> 
<td>8.8<small>C</small></td> 
<td>6.3 <small>&deg;C</small></td> 
<td>66<small>%</small></td> 
<td>NE </td> 
<td>3 <small>mph</small></td> 
<td>7 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1022 <small>hPa</small></td> 
</tr> 
<tr> 
<td>12:29 <small>GMT:</small></td> 
<td>9.0<small>C</small></td> 
<td>6.4 <small>&deg;C</small></td> 
<td>64<small>%</small></td> 
<td>NW </td> 
<td>3 <small>mph</small></td> 
<td>6 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1022 <small>hPa</small></td> 
</tr> 
<tr> 
<td>12:24 <small>GMT:</small></td> 
<td>9.6<small>C</small></td> 
<td>7.4 <small>&deg;C</small></td> 
<td>63<small>%</small></td> 
<td>S </td> 
<td>2 <small>mph</small></td> 
<td>5 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1022 <small>hPa</small></td> 
</tr> 
<tr> 
<td>12:19 <small>GMT:</small></td> 
<td>10.1<small>C</small></td> 
<td>7.4 <small>&deg;C</small></td> 
<td>61<small>%</small></td> 
<td>SW </td> 
<td>4 <small>mph</small></td> 
<td>6 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1022 <small>hPa</small></td> 
</tr> 
<tr> 
<td>12:14 <small>GMT:</small></td> 
<td>10.8<small>C</small></td> 
<td>8.9 <small>&deg;C</small></td> 
<td>61<small>%</small></td> 
<td>SE </td> 
<td>2 <small>mph</small></td> 
<td>2 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1022 <small>hPa</small></td> 
</tr> 
<tr> 
<td>12:09 <small>GMT:</small></td> 
<td>10.7<small>C</small></td> 
<td>8.8 <small>&deg;C</small></td> 
<td>61<small>%</small></td> 
<td>N </td> 
<td>2 <small>mph</small></td> 
<td>3 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1022 <small>hPa</small></td> 
</tr> 
<tr> 
<td>12:04 <small>GMT:</small></td> 
<td>10.3<small>C</small></td> 
<td>8.5 <small>&deg;C</small></td> 
<td>64<small>%</small></td> 
<td>NE </td> 
<td>2 <small>mph</small></td> 
<td>3 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1022 <small>hPa</small></td> 
</tr> 
<tr> 
<td>11:58 <small>GMT:</small></td> 
<td>9.3<small>C</small></td> 
<td>7.6 <small>&deg;C</small></td> 
<td>65<small>%</small></td> 
<td>N </td> 
<td>1 <small>mph</small></td> 
<td>2 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1022 <small>hPa</small></td> 
</tr> 
<tr> 
<td>11:53 <small>GMT:</small></td> 
<td>9.3<small>C</small></td> 
<td>7.8 <small>&deg;C</small></td> 
<td>65<small>%</small></td> 
<td>W </td> 
<td>0 <small>mph</small></td> 
<td>2 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1022 <small>hPa</small></td> 
</tr> 
<tr> 
<td>11:48 <small>GMT:</small></td> 
<td>8.8<small>C</small></td> 
<td>7.1 <small>&deg;C</small></td> 
<td>66<small>%</small></td> 
<td>W </td> 
<td>1 <small>mph</small></td> 
<td>2 <small>mph</small></td> 
<td>0.0 <small>mm</small></td> 
<td>1021 <small>hPa</small></td> 
</tr> 
</table> 

Используя тот же код, как показано ниже

table = soup.find('table') 
for row in table.findAll('tr')[1:]: 
     col = row.findAll('td') 
     if len(col) >= 2: 
       time = col[0].string 
       temp = col[1].string 
print time 
print temp 

время не & темп возврата «никто»

Если я печатаю col все значения есть. Почему len (col)> = 2 не работает для этих данных?

ответ

0
потому, что вы пытаетесь получить ТД от этого тр

Вы аварии:

<tr> 
<th colspan="2" rowspan="2">Date &amp; time</th> 
<th rowspan="2">Temp</th> 
<th rowspan="2">Feels like</th> 
<th rowspan="2">Humidity</th> 
<th colspan="3">Wind</th> 
<th rowspan="2">Rain</th> 
<th rowspan="2">Pressure</th> 
</tr> 

Просто добавить что-то вроде этого:

col = row.findAll('td') 
if len(col) >= 2: 
    time = col[0].string 
    temp = col[1].string 
+0

Большое спасибо, что работает для таблицы выше, я добавил следующее просто представить температуру, а не deg c. a = re.sub (r '[^ 0-9 \ - \ d.]', '', temp) Время печати print a – user3176960

Смежные вопросы