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