HNews "задать раздел" страницы выскабливание скрипт Python


Вот небольшой скрипт я написал, чтобы получить HNews задать раздел и отображать их без использования веб-браузера. Я просто ищу обратную связь о том, как улучшить мой стиль/кодирование логики/общий код.

#!/usr/bin/python

'''This script gets the headlines from hacker news ask section'''

import urllib2
import HTMLParser
import re

class HNParser(HTMLParser.HTMLParser):
def __init__(self):
    HTMLParser.HTMLParser.__init__(self)
    self.data=[]
    self.recording=0

def handle_starttag(self, tag, attribute):
    if tag!='a':
        return
    elif self.recording:
        self.recording +=1
        return
    for name, value in attribute:
        if name=='href' and value[0]=='i':
            break
    else:
        return
    self.recording=1

def handle_endtag(self, tag):
    if tag=='a' and self.recording:
        self.recording-=1

def handle_data(self, data):
    if self.recording:
        self.data.append(data)


HOST='http://news.ycombinator.com/ask'
parser=HNParser()
f=urllib2.urlopen(HOST)
rawHTML=f.read()
parser.feed(rawHTML)
i=0
for items in parser.data:
    try:
        print parser.data[2*i]
        i+=1
    except IndexError:
        break
 parser.close()


279
2
задан 13 декабря 2011 в 11:12 Источник Поделиться
Комментарии
2 ответа

Это как я бы изменить свой сценарий. Комментарии рядный. Эта версия PEP8-PyLint-PyFlakes утв. ;-)

#!/usr/bin/python

'''This script gets the headlines from hacker news ask section'''

import urllib2
import HTMLParser
# remove unused imports

class HNParser(HTMLParser.HTMLParser):

# use class-level attribute instead of "magic" strings.
tag_name = 'a'

def __init__(self):
HTMLParser.HTMLParser.__init__(self)
self.data = []
self.recording = 0

def handle_starttag(self, tag, attribute):

if tag != self.tag_name:
return

# clearer implicit loop, with no "break"
if not any(name == 'href' and value.startswith('item')
for name, value in attribute):
return

# no need to check if self.recording == 0, because in that case setting
# self.recording = 1 is equivalent to incrementing self.recording!
self.recording += 1

def handle_endtag(self, tag):
if tag == self.tag_name and self.recording:
self.recording -= 1

def handle_data(self, data):
if self.recording:
self.data.append(data)

def main():
HOST = 'http://news.ycombinator.com/ask'
parser = HNParser()
f = urllib2.urlopen(HOST)
rawHTML = f.read()
parser.feed(rawHTML)
try:
# use fancy list indexing and omit last "Feature Request" link
for item in parser.data[:-1:2]:
print item
finally:
# close the parser even if exception is raised
parser.close()

if __name__ == '__main__':
main()

1
ответ дан 22 декабря 2011 в 03:12 Источник Поделиться

Вместо HTMLParser.HTMLParser.__инит__(самостоятельная) вы должны написать супер(HTMLParser.HTMLParser, самовыдвижение).__инит__()

urllib2 и HTMLParser, хотя в комплекте с Python, очень ограничены. запросы и библиотека lxml + cssselect более мощные. С ними, ваш скрипт может быть написан как

import requests
from lxml.html import fromstring
content = requests.get('https://news.ycombinator.com/ask').content
html_doc = fromstring(content)
# Select all title links & ignore
links = html_doc.cssselect('.title > a[href^=item]')
print '\n'.join(link.text for link in links)

0
ответ дан 13 апреля 2014 в 11:04 Источник Поделиться