设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 创业者
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

8 个 Python 实用脚本,收藏备用(3)

发布时间:2019-10-09 22:30 所属栏目:21 来源:实验楼
导读:6.下载Leetcode的算法题。 importsys importre importos importargparse importrequests fromlxmlimporthtmlaslxml_html try: importhtml exceptImportError: importHTMLParser html=HTMLParser.HTMLParser() try:

6.下载Leetcode的算法题。

  1. import sys 
  2. import re 
  3. import os 
  4. import argparse 
  5. import requests 
  6. from lxml import html as lxml_html 
  7. try: 
  8.  import html 
  9. except ImportError: 
  10.  import HTMLParser 
  11.  html = HTMLParser.HTMLParser() 
  12. try: 
  13.  import cPickle as pk 
  14. except ImportError: 
  15.  import pickle as pk 
  16. class LeetcodeProblems(object): 
  17.  def get_problems_info(self): 
  18.  leetcode_url = 'https://leetcode.com/problemset/algorithms' 
  19.  res = requests.get(leetcode_url) 
  20.  if not res.ok: 
  21.  print('request error') 
  22.  sys.exit() 
  23.  cm = res.text 
  24.  cmt = cm.split('tbody>')[-2] 
  25.  indexs = re.findall(r'<td>(\d+)</td>', cmt) 
  26.  problem_urls = ['https://leetcode.com' + url \ 
  27.  for url in re.findall( 
  28.  r'<a href="(/problems/.+?)"', cmt)] 
  29.  levels = re.findall(r"<td value='\d*'>(.+?)</td>", cmt) 
  30.  tinfos = zip(indexs, levels, problem_urls) 
  31.  assert (len(indexs) == len(problem_urls) == len(levels)) 
  32.  infos = [] 
  33.  for info in tinfos: 
  34.  res = requests.get(info[-1]) 
  35.  if not res.ok: 
  36.  print('request error') 
  37.  sys.exit() 
  38.  tree = lxml_html.fromstring(res.text) 
  39.  title = tree.xpath('//meta[@property="og:title"]/@content')[0] 
  40.  description = tree.xpath('//meta[@property="description"]/@content') 
  41.  if not description: 
  42.  description = tree.xpath('//meta[@property="og:description"]/@content')[0] 
  43.  else: 
  44.  description = description[0] 
  45.  description = html.unescape(description.strip()) 
  46.  tags = tree.xpath('//div[@id="tags"]/following::a[@class="btn btn-xs btn-primary"]/text()') 
  47.  infos.append( 
  48.  { 
  49.  'title': title, 
  50.  'level': info[1], 
  51.  'index': int(info[0]), 
  52.  'description': description, 
  53.  'tags': tags 
  54.  } 
  55.  ) 
  56.  with open('leecode_problems.pk', 'wb') as g: 
  57.  pk.dump(infos, g) 
  58.  return infos 
  59.  def to_text(self, pm_infos): 
  60.  if self.args.index: 
  61.  key = 'index' 
  62.  elif self.args.title: 
  63.  key = 'title' 
  64.  elif self.args.tag: 
  65.  key = 'tags' 
  66.  elif self.args.level: 
  67.  key = 'level' 
  68.  else: 
  69.  key = 'index' 
  70.  infos = sorted(pm_infos, key=lambda i: i[key]) 
  71.  text_template = '## {index} - {title}\n' \ 
  72.  '~{level}~ {tags}\n' \ 
  73.  '{description}\n' + '\n' * self.args.line 
  74.  text = '' 
  75.  for info in infos: 
  76.  if self.args.rm_blank: 
  77.  info['description'] = re.sub(r'[\n\r]+', r'\n', info['description']) 
  78.  text += text_template.format(**info) 
  79.  with open('leecode problems.txt', 'w') as g: 
  80.  g.write(text) 
  81.  def run(self): 
  82.  if os.path.exists('leecode_problems.pk') and not self.args.redownload: 
  83.  with open('leecode_problems.pk', 'rb') as f: 
  84.  pm_infos = pk.load(f) 
  85.  else: 
  86.  pm_infos = self.get_problems_info() 
  87.  print('find %s problems.' % len(pm_infos)) 
  88.  self.to_text(pm_infos) 
  89. def handle_args(argv): 
  90.  p = argparse.ArgumentParser(description='extract all leecode problems to location') 
  91.  p.add_argument('--index', action='store_true', help='sort by index') 
  92.  p.add_argument('--level', action='store_true', help='sort by level') 
  93.  p.add_argument('--tag', action='store_true', help='sort by tag') 
  94.  p.add_argument('--title', action='store_true', help='sort by title') 
  95.  p.add_argument('--rm_blank', action='store_true', help='remove blank') 
  96.  p.add_argument('--line', action='store', type=int, default=10, help='blank of two problems') 
  97.  p.add_argument('-r', '--redownload', action='store_true', help='redownload data') 
  98.  args = p.parse_args(argv[1:]) 
  99.  return args 
  100. def main(argv): 
  101.  args = handle_args(argv) 
  102.  x = LeetcodeProblems() 
  103.  x.args = args 
  104.  x.run() 
  105. if __name__ == '__main__': 
  106.  argv = sys.argv 
  107.  main(argv) 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读