python - 作業9:讀取html格式數據
github指路 沖沖沖沖衝
----------------------------------原文–如下--------------------------------
2019/12/11 更新
/學院改名了/叫做→信息管理與人工智能學院了(在教務處看推薦課表的時候發現的,但是呢只是官網上的名字還沒有改/畢竟沒有這麼注重細節?想改名就改名了聽起來好像有點隨便啊…
---------------------------原文---------------------------------
先看一下這個作業的
具體描述
,就是從網絡上讀取一個特定的html腳本,再將裏面的教師信息數據整合起來存成一個DataFrame的數據結構,然後在python裏面print出來= =
這個東西就有點煩的樣子
然後,比較複雜的一點就是因爲是我們學校的官網(就是相比於官方的一些網站來講)代碼顯得很沒有條理……沒辦法= =
所以這東西
分析
起來就比較煩的樣子,首先我們要先,用眼睛找到這些數據在哪裏……
所以說我打開了我們信工學院官網的教師介紹頁面(全稱是浙江財經大學信息管理與工程學院,希望幾年之後他還是叫這個名字,因爲emm聽到風聲說學院似乎要改名了)。大概是這個樣子↓
先明確我們需要什麼信息,怎麼存儲數據(這樣可以少走彎路,當然這是在我寫完作業之後才謎之總結出來的結果))))
和之前的那個讀kml數據的作業一樣先把所有的你可能要用的數據print出來看,(其實我覺得這種方法又蠢又高效,因爲只有看到我代碼裏得到的信息,我才能和我想象中想要得到的信息放在一起對比—>錯的話可以知道自己錯在哪裏,對的話離成功極近)
好的現在回答做這個作業我們需要什麼信息,很簡單我們需要教師名稱,對應的職位(教授、副教授和講師)就是表格前面的描述括號裏面的是職稱對應的人數,還有對應的個人主頁(上面包括了這位老師的研究方向和個人科研成果之類的介紹,有助於= =大一新生選導師= =)
ok其實要拿到的信息也不是很多,一個個來,先看看這讓人頭痛的網頁結構,右鍵 -> 檢查可以查看網頁源代碼
然後我們可以發現這個網頁其實不是很複雜,只有600+行
那我們要在源碼裏面把這個表格得到,它大概在這裏
所以我們要獲取的資料是tr尖括號內的文本字符(也就是教師的姓名信息)怎麼獲取呢,看一下–>那啥老師上課時候的例子
解釋一下上面的doc就是獲取的html裏面的所有的信息,然後其中的links就是拿到裏面所有的a標籤的信息,因爲a這個標籤的話就是放置鏈接的專用標籤可以這樣說= =doc.findall('.//a')
然後links[0].text_content()的話就是獲取a標籤之間的文本信息,舉個栗子:
<a href='#'>xxx</a>
(假設這個東西是links[0]也就是這個網頁裏面的第一條a的內容的時候)獲取的links[0].text_content()就是xxx
ok那按照上面的操作,得到相應的a文本之後,嘗試一下把他輸出康康,
因爲數據太雜了,有很多沒有用的東西(等我寫完作業之後w同學和我說了可以先捕捉到含有這個表格的div元素然後直接從這個div裏面拿到相應的信息,我覺得我有點……)
這個是第二個for循環的輸出,就是獲取links裏面的信息print出來的內容:
然後,這是tr裏面的信息,也是有很多空格,我懷疑是裏面的< br >搞得事情……但是我沒有證據,就是我無法捕捉到這個東西我試着用’\n’ ‘\t’ ’ ’ 等等各種東西都試了一遍絕了,但是還是不對kjj
就是改不掉上實驗課的時候我表現得極有耐心(我真的服我自己,換句話說打代碼的時間真是短暫啊,一下就 下課了)
但是好消息是我在下課前= =找到了把這東西去掉的方式,換句話說就是= =只輸出有鏈接和教師信息的那些條數據= =
which means–>去掉了那些看起來很難搞的數據
我是怎麼做到的(靈光一現,然後)我想到了一個判斷條件,只要links裏面的text_content和tds裏面一樣就輸出if item.text_content() == j.text_content()
(就這樣)
非常好,但是還是有一些漏網之魚,這種情況就直接特判跳出循環就可以了~
誇!然後放一下
基礎代碼
隨便 想想就知道怎麼做了= =
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/11/5 11:15
# @Author : Chen Shan
# Function :Using Python to crawl useful data in HTML format and store it in dataframe data format
from lxml.html import parse
from urllib.request import urlopen
import pandas as pd
parsed = parse(urlopen('http://info.zufe.edu.cn/xygk/szdw.htm'))
doc = parsed.getroot()
strongs = doc.findall('.//strong')
links = doc.findall('.//a')
tds = doc.findall('.//td')
for i in strongs:
print(i.text_content())
for j in links:
print(j, j.get('href'), j.text_content())
for item in tds:
print(item, item.text_content())
flag = 0
index = 1
dict = {'FULL_NAME':[], 'POSITION':[], 'HOME_LINK':[]}
for item in tds:
for j in links:
//劃重點,兩者的交集= =
if item.text_content() == j.text_content():
……
……
……
=-=-=-=-=-=-=-=-=-=-=更新分割線=-=-=-=-=-=-=-=-=-=-=
2020/02/04 更新code
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/11/5 11:15
# @Author : Chen Shan
# Function :Using Python to crawl useful data in HTML format and store it in dataframe data format
from lxml.html import parse
from urllib.request import urlopen
import pandas as pd
parsed = parse(urlopen('http://info.zufe.edu.cn/xygk/szdw.htm'))
doc = parsed.getroot()
strongs = doc.findall('.//strong')
links = doc.findall('.//a')
tds = doc.findall('.//td')
for i in strongs:
print(i.text_content())
for j in links:
print(j, j.get('href'), j.text_content())
for item in tds:
print(item, item.text_content())
flag = 0
index = 1
dict = {'FULL_NAME':[], 'POSITION':[], 'HOME_LINK':[]}
for item in tds:
for j in links:
if item.text_content() == j.text_content():
if item.text_content() == '信息管理系':
flag=1
break
if j.get('href') != '../index.htm':
if index <= 14:
position = 'Professor'
elif index <= 45:
position = 'Associate professor'
else:
position = 'Lecturer'
index+=1
dict['FULL_NAME'].append(j.text_content())
dict['HOME_LINK'].append(j.get('href'))
dict['POSITION'].append(position)
print(j.text_content(),j.get('href'))
break
if flag == 1:
break
data_frame = pd.DataFrame(dict)
print(data_frame)