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

2024-06-28 14:39:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一个气象站点提取数据,并将其复制到csv文件中以供进一步分析。我正在使用python和beauthoulsoup。我一直在努力从天气报告和数值中得到受影响的城市。 下面是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>

我需要表格中的四个值:

^{pr2}$

我还需要这个地方的名字:

<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"))

将所有信息导出到csv文件后的最佳方法是什么,以便具有分离的值:

杰梅因德·阿尔伯根
多尔雷根机场
做,10。8月12:00 Uhr
萨,12岁。8月6:00 Uhr
威克塞尔恩德的特瑞特达乌尔根。Dabei werden Niederschlagsmengen zwischen 35 l/m²和50 l/m²Erwarett。在Staulagen werden Mengen bis,70 l/m²。在

我使用的是python3.6 请帮忙。在


Tags: dividhtmltablecolh2traug
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。在

^{pr2}$

您可以将要保存在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."

就像我说的,我不知道田地是什么。你可以给它们起个更好的名字。 然后你将得到:

^{pr2}$

希望这有道理。在

相关问题 更多 >