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

Python 使用BeautifulSoup将数据从html提取到csv,python,beautifulsoup,Python,Beautifulsoup,我想从天气站点提取数据,并将其复制到csv文件中进行进一步分析。我正在使用python和BeautifulSoup。我一直在努力从天气报告和数值中了解受影响的城市。 Hier是HTML的外观: > <html> <head> <meta charset="utf-8"/> </head> <body> <div > id="main"> <div id="wettertab"> &

我想从天气站点提取数据,并将其复制到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>
现在,我可以打印表中的值,还可以通过以下方式获得城市名称:

gemeinde_list = []
for gemeinde in soup.findAll('h2'):
    gemeinde_list.append(gemeinde.get("id"))
为了获得单独的值,将所有信息导出到csv文件的最佳方式是:

杰梅因德·阿伯根
Amtliche WARNUNG vor DAUERREGEN
做,10。8月12:00 Uhr
萨,12岁。八月,06:00 Uhr
这是特里特·达埃雷根·韦奇施罗德·恩斯特里特·奥夫(tritt Dauerregen wechselnder Intensität auf)。Dabei werden Niederschlagsmengen zwischen 35 l/m²和50 l/m²Erwarett。在Staulagen-werden-Mengen bis中为70 l/m²

我正在使用Python 3.6
请提供帮助。

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

希望这有意义。

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

希望这是有意义的。

因为表或标题都没有任何特征属性,所以可以使用
查找下一个兄弟姐妹
/
查找上一个兄弟姐妹
方法来获取相邻的标记

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)

由于表或标题都没有任何特征属性,因此可以使用
查找下一个兄弟姐妹
/
查找上一个兄弟姐妹
方法来获取相邻的标记

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)


您可以使用Python附带的csv模块。您好,Mekicha,是的,我想困难的部分是如何将html文件中的值组合在一起,当我将这些值组合在一起时,可能是一个列表,我想我将能够将它们存储在csv中。我目前的问题是如何处理所描述的值。您可以使用Python附带的csv模块。您好,Mekicha,是的,我想困难的部分是如何将html文件中的值组合在一起,当我将这些值组合在一起时,可能是作为一个列表,我想我将能够将它们存储在csv中。我目前的问题是,如何调整所描述的值。结构是正确的。我的问题是如何从html中提取该格式的数据。正如您在上面的HTML示例中所看到的,城市的名称不在表中,我不知道如何将城市与每个表匹配。提取城市并将其保存为city_name,然后解析表并提取所需的其他变量,同时保存它们。然后创建元组。还是重复这些行?也就是说,每个城市名称有多个表?例如,您可以检查是否有一个div包含h2和每个天气条目的表,或者您可以查看每个表是否有h2元素。您可以
findAll h2
表格
。在这种情况下,h2和表有两个列表。您可以循环使用这两种方法来创建元组或使用
zip
。如果这样做没有帮助,请告诉我结构是否正确。我的问题是如何从html中提取该格式的数据。正如您在上面的HTML示例中所看到的,城市的名称不在表中,我不知道如何将城市与每个表匹配。提取城市并将其保存为city_name,然后解析表并提取所需的其他变量,同时保存它们。然后创建元组。还是重复这些行?也就是说,每个城市名称有多个表?例如,您可以检查是否有一个div包含h2和每个天气条目的表,或者您可以查看每个表是否有h2元素。您可以
findAll h2
表格
。在这种情况下,h2和表有两个列表。您可以循环使用这两种方法来创建元组或使用
zip
。让我知道如果这没有帮助它看起来整个东西都在一个div中。因此,如果你在每个页面上有多个div,那么将main元素设为div标记。因此,对于每个div,您需要做的就是从第二个tr@jlaur中的tds中获取.h2和all.text。我们不知道html的确切结构,所以我尝试了一个更通用的解决方案:“查找所有表和前面的'h2'。然而,您的想法:“查找至少包含一个'h2'和'table'的所有div”也可以,甚至更好。很好@t、 亚当:很好,很优雅。谢谢在搜索页面中只有一个div,html代码实际上非常简单,只有一个div和许多表。我知道a有一个列表。如何将列表的第一项与其他文件中的其他列表进行比较?您可以使用
[I[0]for I in data]
选择
数据中所有列表的第一项。如果您想从文件中读取
数据
列表,请使用:
将open('my_file.csv','rb')作为f:data=list(csv.reader(f))
看起来整个内容都在一个div中。因此,如果在每个页面上都有多个,请将main元素设为div标记。因此,对于每个div,您需要做的就是从第二个tr@jlaur中的tds中获取.h2和all.text。我们不知道html的确切结构,所以我尝试了一个更通用的解决方案:“查找所有表和前面的'h2'。然而,您的想法:“查找至少包含一个'h2'和'table'的所有div”也可以,甚至更好。很好@t、 亚当:那是我