使用BeautifulSoup将数据从html提取到csv

时间:2017-08-14 13:31:23

标签: python beautifulsoup

我想从天气网站提取数据并将其复制到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 请帮忙。

2 个答案:

答案 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)

希望这是有道理的。