我想从天气网站提取数据并将其复制到csv文件以进行进一步分析。我正在使用python和BeautifulSoup。我一直在努力,以便从天气预报和价值观中获取受影响的城市。 Hier是HTML的样子:
> <html> <head> <meta charset="utf-8"/> </head> <body> <div
> id="main"> <div id="wettertab">
> <p>
> <strong>
> Letzte Aktualisierung: Do, 10. Aug, 18:41 Uhr
> </strong>
> </p>
> <h1 id="Hessen">
> Hessen
> </h1>
> <h2 id="Gemeinde Aarbergen">
> Gemeinde Aarbergen
> </h2>
> <table>
> <colgroup>
> <col <="" class="firstColumn" col=""/>
> <col class="colorColumn"/>
> <col class="colorColumn"/>
> <col class="colorColumn"/>
> <thead>
> <tr>
> <th>
> Schlagzeile
> </th>
> <th>
> Gültig von
> </th>
> <th>
> Gültig bis
> </th>
> <th>
> Beschreibung
> </th>
> </tr>
> </thead>
> <tr>
> <td>
> Amtliche WARNUNG vor DAUERREGEN
> </td>
> <td>
> Do, 10. Aug, 12:00 Uhr
> </td>
> <td>
> Sa, 12. Aug, 06:00 Uhr
> </td>
> <td>
> Es tritt Dauerregen mit Unterbrechungen auf. Dabei werden Niederschlagsmengen zwischen 40 l/m² und 60 l/m² erwartet.
> </td>
> </tr>
> </colgroup>
> </table>
表格中有四个值我需要:
<tr>
<td> Amtliche WARNUNG vor DAUERREGEN
</td>
<td> Do, 10. Aug, 12:00 Uhr
</td>
<td> Sa, 12. Aug, 06:00 Uhr
</td>
<td> Es tritt Dauerregen mit Unterbrechungen auf. Dabei werden Niederschlagsmengen zwischen 40 l/m² und 60 l/m² erwartet.
</td>
</tr>
我还需要这个地方的名字:
<h2 id="Gemeinde Aarbergen">
Gemeinde Aarbergen
</h2>
“h2”的HTML标记总是在表格之前,但它不属于表格本身,正如我所见。
到目前为止,这是我的代码段:
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("html_warnung.html")
soup = BeautifulSoup(html, 'html.parser')
table = soup.findAll("table")
for div in table:
row = ''
rows = div.findAll('td')
for row in rows:
print(row.text)
现在我可以打印表格中的值,我也可以通过以下方式获取城市名称:
gemeinde_list = []
for gemeinde in soup.findAll('h2'):
gemeinde_list.append(gemeinde.get("id"))
将所有信息togehter导出到csv文件的最佳方法是什么,以便获得separeted值:
Gemeinde Aarbergen
Amnliche WARNUNG vor DAUERREGEN
做,8月10日,12:00 Uhr
Sa,12月12日,06:00 Uhr
Es tritt DauerregenwechselnderInnsnsitätauf。 Dabei werden Niederschlagsmengen zwischen 35 l /m²和50 l /m²erwartet。在Staulagen werden Mengen bis 70 l /m²erreicht。
我正在使用Python 3.6 请帮忙。
答案 0 :(得分:2)
由于表格或标题都没有任何特征属性,因此您可以使用find_next_siblings
/ find_previous_siblings
方法获取相邻标记。
tables = soup.find_all('table')
data = []
for table in tables:
previous = table.find_previous_siblings('h2')
id = previous[0].get('id') if previous else None
rows = [td.get_text(strip=True) for td in table.find_all('td')]
data.append([id] + rows)
data
变量是一个嵌套列表,您现在可以写入csv。
with open('my_file.csv', 'wb') as f:
writer = csv.writer(f)
writer.writerows(data)
答案 1 :(得分:0)
您可以将要保存在csv行中的数据放入元组中。基本上,在提取变量时将它们分配给变量并将它们全部放入元组中。 我不完全了解您正在提取的数据的结构。
但我想:
city_name = "Gemeinde Aarbergen"
start_date = "Do, 10. Aug, 12:00 Uhr"
end_date = "Sa, 12. Aug, 06:00 Uhr"
desc = "Es tritt Dauerregen wechselnder Intensität auf. Dabei werden Niederschlagsmengen zwischen 35 l/m² und 50 l/m² erwartet. In Staulagen werden Mengen bis 70 l/m² erreicht."
正如我所说,我不知道这些领域是什么。你可以更好地命名他们。 然后你会有:
import csv
csv_row = (city_name, start_date, end_date, desc)
with open(filename, "wb") as csv_file:
writer = csv.writer(csv_file, delimiter=',')
writer.writerow(csv_row)
希望这是有道理的。