Мне нужно извлечь значение из таблицы 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 & 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 °C</td>
<td>9.8 °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 °C</td>
<td>9.7 °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 °C</td>
<td>9.9 °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 °C</td>
<td>9.7 °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 °C</td>
<td>9.3 °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 °C</td>
<td>8.7 °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 °C</td>
<td>7.9 °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>°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>°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>°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>°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>°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>°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>°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>°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>°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>°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>°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>°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 не работает для этих данных?
Большое спасибо, что работает для таблицы выше, я добавил следующее просто представить температуру, а не deg c. a = re.sub (r '[^ 0-9 \ - \ d.]', '', temp) Время печати print a – user3176960