Py / Python網頁資料擷取與分析班-筆記 8/23

主要內容

_下載XML格式資料、存檔並用ElementTree解析

_網頁資料擷取與beautifulsoup4套件


1.下載XML格式資料、存檔並用ElementTree解析

資料來源:新北市公共自行車租賃系統(YouBike)

透過requests模組取得政府公開資訊的xml格式資料並在本機存檔

再利用xml.etree模組的ElementTree函式來解析xml檔案

解析之後的資料在python是字典型態

因此,可以用字典的方式來取得裡面的資料,key-標籤,value-標籤內容

新北市公共自行車租賃系統(YouBike)的xml架構

root節點-table

                     -row

                            -Col1…

資料都在row節點內的Col1~Col14標籤內容

取出標籤內容是取得text屬性值

取出值之後就可以轉存成csv檔或者excel檔了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import requests
html = requests.get("https://quality.data.gov.tw/dq_download_xml.php?nid=123026&md5_url=4d8de527a0bcd8a7b1aeae91120f021d")
f1=open("youbike.xml",'w',encoding="utf-8")
f1.write(html.text)
f1.close()

from xml.etree import ElementTree as ET
obj=ET.parse("youbike.xml")
youbike_root = obj.getroot()
# print(len(youbike_root))

s="sno(站點代號),sna(中文場站名稱),tot(場站總停車格)\n"
for youbike_row in youbike_root:
    s+="{},{},{}\n".format(youbike_row[0].text,youbike_row[1].text,youbike_row[2].text)
#print(s)
#轉存為csv
f2=open("youbike.csv","w",encoding="UTF-8")
f2.write(s)
f2.close()

cols=["sno(站點代號)","sna(中文場站名稱)","tot(場站總停車格)"]
data=[]
index=[]

for i in range(0,len(youbike_root)):   
    data.append([youbike_root[i][0].text,youbike_root[i][1].text,youbike_root[i][2].text])
    index.append(i+1)

import pandas as pd
df = pd.DataFrame(data,index,cols)
#print(df)
df.to_excel("youbike.xlsx")

 

2.網頁資料擷取與beautifulsoup4套件

使用beautifulsoup4模組解析網頁內容

比較常使用find() 或 find_all()來取得標籤資料

find()會取得第一個符合條件的標籤資料

find_all()會取得所有符合條件的標籤資料,並存成串列型態

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
html="""
<html>
<head>
<meta charset="utf-8"/>
<title>Hello</title>
</head>
<body>
<p>Hello World4</p>
<p>Hello World2</p>
<p>Hello World3</p>
</body>
</html>
"""
#--------------------------
from bs4 import BeautifulSoup
sp = BeautifulSoup(html, "html.parser")
print(sp.find("p"))     #包含標籤
print(sp.find("p").text)
print(sp.find_all("p")) #串列型態 


list1=sp.find_all("p")
for i in range(len(list1)):
    print(list1[i].text)