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出來的內容:
輸出情況2

然後,這是tr裏面的信息,也是有很多空格,我懷疑是裏面的< br >搞得事情……但是我沒有證據,就是我無法捕捉到這個東西我試着用’\n’ ‘\t’ ’ ’ 等等各種東西都試了一遍絕了,但是還是不對kjj

就是改不掉上實驗課的時候我表現得極有耐心(我真的服我自己,換句話說打代碼的時間真是短暫啊,一下就 下課了)
輸出情況3

但是好消息是我在下課前= =找到了把這東西去掉的方式,換句話說就是= =只輸出有鏈接和教師信息的那些條數據= =

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章