python3 实现 virtual judge 日志(二):爬取HDU的页面 (2016.11.4更新)

2016.11.02更新:

1.目前功能可以爬取到文字,并且支持中文

2.还没有处理关于HDU图片的问题

3.还没有处理其他OJ的类,也在思考如何选取不同的OJ,调用不同的类。

4.目前还没有查出是自身网速还是HDU自身问题,经常会' 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败' ,考虑如何加异常


2016.11.03 更新:

1.更新了查找带图片的题,使用了异常处理

2.考虑到数学公式题的处理(异常处理思路:和图片一样,把mathjax提取出来留下来,以后交给html处理)

3.还是没有能处理好页面的br标签和nbsp标签,(思路:使用find查找,然后循环输出。这个思路不够明确)


2016.11.04更新:

1.发现了思想误区:html网页是可以识别标签的!!!所以根本不用处理标签,只要把属于题面的那一行处理出来就好了;


# -*- coding=utf-8 -*-
import requests
import re
import time
from bs4 import BeautifulSoup
class spider(object):

   def get_PD(self,proID):
        url = 'http://acm.hdu.edu.cn/showproblem.php?pid='
        html = requests.get(url + str(proID)).content
        soup= BeautifulSoup(html, 'lxml')

        print("======题目名称:======")
        hduoj = soup.find_all('h1')
        for i in hduoj:
            title = i.contents[0].string
            break
        print(title)

        soup = soup.find('table', attrs={'width': '980', 'border': '0', 'align': 'center', 'cellspacing': '0'})
        soup = soup.find_all('div',attrs={'class':'panel_content'})
        n = 0
        s = list()
        for i in soup:
            if n == 0 :
                n+=1
                print("======Problem Description======")
                try:  #对图像题的异常处理
                    title = i.img['src']
                    for j in title:
                        if n < 2:
                            n += 1
                            continue
                        s.append(j)
                    strlen = ''.join(s)
                    url2 = 'http://acm.hdu.edu.cn/' + strlen
                    print(i)
                    print(url2)
                    continue
                except:
                    print(i)
                    continue
            if n==1:
                n+=1
                print("======Input======")
                print(i)
                continue
            if n==2:
                n+=1
                print("======Output======")
                print(i)
                continue
            if n==3:
                n+=1
                print("======Sample Input======")
                print(i)
                continue
            if n==4:
                n+=1
                print("======Sample Output======")
                print(i)
                continue
            if n==5:
                n+=1
                print("======Author======")
                print(i)
                continue
            if n>5:
                break
if __name__ == '__main__':
    c = spider()
    problemID = input("请输入你想查询的题号:")
    c.get_PD(problemID)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kelisita

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值