Discuss / Python / 感觉写的好low哈哈哈 但是应该比较容易读懂吧

感觉写的好low哈哈哈 但是应该比较容易读懂吧

Topic source

from html.parser import HTMLParser from html.entities import name2codepoint from urllib import request import re

class MyHTMLParser(HTMLParser):
def init(self): super(MyHTMLParser,self).init() self.__parsedata='' #设置一个空状态

def handle_starttag(self, tag, attrs):
    if ('class','event-title') in attrs:
        self.__parsedata='name' #设置爬取名称状态 
    if tag=='time':
        self.__parsedata='time'
    if ('class','say-no-more') in attrs:
        self.__parsedata='year'
    if ('class','event-location') in attrs:
        self.__parsedata='location'

def handle_endtag(self,tag):
    if tag == 'h3' or tag == 'span':
        self.__parsedata=''

def handle_data(self, data):
    if  self.__parsedata=='name':
        print('会议名称:%s'%data)

    if  self.__parsedata=='time':
        print('会议时间:%s'%data)

    if  self.__parsedata=='year':
        if re.match(r'\s\d{4}',data):
            #因为后面还有两组 say-no-more 后面的data却不是年份信息,所以用正则检测一下
            print('会议年份:%s'%data.strip()) 

    if  self.__parsedata=='location':
        print('会议地点:%s'%data)
        print('----------------------------------')

parser = MyHTMLParser()

URL = 'https://www.python.org/events/python-events/'

with request.urlopen(URL, timeout=15) as f: # 打开网页并取到数据 data = f.read() parser.feed(data.decode('utf-8'))

这个分割线好烦

会议名称:PyCon Ghana 2018
会议时间:10 Aug. – 12 Aug. 
会议年份:2018
会议地点:Accra, Ghana
----------------------------------
会议名称:PyData Delhi 2018
会议时间:11 Aug. – 13 Aug. 
会议年份:2018
会议地点:New Delhi, India
----------------------------------
会议名称:PyCon Korea 2018
会议时间:15 Aug. – 20 Aug. 
会议年份:2018
会议地点:Seoul, South Korea
----------------------------------
会议名称:PyBay 2018
会议时间:16 Aug. – 20 Aug. 
会议年份:2018
会议地点:San Francisco, CA, USA
----------------------------------
会议名称:PyCon PL 2018
会议时间:23 Aug. – 27 Aug. 
会议年份:2018
会议地点:Ossa, Poland
----------------------------------
会议名称:Flask Conference
会议时间:24 Aug. – 26 Aug. 
会议年份:2018
会议地点:São Paulo, Brazil
----------------------------------
会议名称:EuroPython 2018
会议时间:23 July – 30 July 
会议年份:2018
会议地点:Edinburgh, UK
----------------------------------
会议名称:PyCon Russia
会议时间:22 July – 24 July 
会议年份:2018
会议地点:Gribovka, Kaluga Oblast, Russia
----------------------------------

#reslut: "``` 会议名称:PyCon Ghana 2018 会议时间:10 Aug. – 12 Aug. 会议年份:2018

会议地点:Accra, Ghana

会议名称:PyData Delhi 2018 会议时间:11 Aug. – 13 Aug. 会议年份:2018

会议地点:New Delhi, India

会议名称:PyCon Korea 2018 会议时间:15 Aug. – 20 Aug. 会议年份:2018

会议地点:Seoul, South Korea

会议名称:PyBay 2018 会议时间:16 Aug. – 20 Aug. 会议年份:2018

会议地点:San Francisco, CA, USA

会议名称:PyCon PL 2018 会议时间:23 Aug. – 27 Aug. 会议年份:2018

会议地点:Ossa, Poland

会议名称:Flask Conference 会议时间:24 Aug. – 26 Aug. 会议年份:2018

会议地点:São Paulo, Brazil

会议名称:EuroPython 2018 会议时间:23 July – 30 July 会议年份:2018

会议地点:Edinburgh, UK

会议名称:PyCon Russia 会议时间:22 July – 24 July 会议年份:2018

会议地点:Gribovka, Kaluga Oblast, Russia

```"

前面几句的super有什么作用?

把子类跟父类都初始化一下 百度搜一下

另刀一刀

#6 Created at ... [Delete] [Delete and Lock User]

Traceback (most recent call last): File "E:/Python/Project/PythonLearn/use_HTMLParser.py", line 69, in <module> parser.feed(data.decode('utf-8')) File "E:\Python\lib\html\parser.py", line 111, in feed self.goahead(0) File "E:\Python\lib\html\parser.py", line 163, in goahead self.handle_data(unescape(rawdata[i:j])) File "E:/Python/Project/PythonLearn/use_HTMLParser.py", line 26, in handle_data if self.parsedata == 'name': AttributeError: 'MyHTMLParser' object has no attribute '_MyHTMLParserparsedata'

这个报错是为什么呢?

永远短毛

#7 Created at ... [Delete] [Delete and Lock User]

巴西圣保罗这一行解析不了。。 会议地点:São Paulo, Brazil

UnicodeEncodeError: 'gbk' codec can't encode character '\xe3' in position 6: illegal multibyte sequence

大神,请问下:

def handle_starttag(self, tag, attrs): 中的if tag=='time': 改成 if attrs[0][0]=='datetime': 为什么不行呢?(报错IndexError: list index out of range)

有些时候没有上线了 回复一下7# 因为我做这个练习的时候并没有这个问题,你这个是编码问题 解决一下编码就行了 回复一下8# 报错信息已经说得很清楚 是超出了索引的范围 attrs好像是一个字典的形式 过去有些久了我也有些忘了,建议学习一下简单的html知识,再来做一章会简单很多,我当时没有学习html所以很吃力

好东西,顶一个。这个方法真的很贴合初始的HTMLParse的三个函数,可以让人了解到HTMLParser到底是怎样解析数据的,初学者切勿盲目追求少些程序,图快未必是好事,评论里还有的就是过于复杂,不方便理解,总的看来,还是这个好。

  • 1
  • 2

Reply