Ошибка в сканировании подкатегории Википедии с использованием python3 - PullRequest
0 голосов
/ 05 октября 2018

Привет, участники сообщества,

Я получаю ошибку NameError: name 'f' is not defined.Код выглядит следующим образом.Пожалуйста помоги.Любая помощь приветствуется.Я был поражен этим с 3 дней.Код предназначен для извлечения всех названий подкатегорий категории Википедии в Python 3.

Я пробовал относительные и абсолютные пути.

Код выглядит следующим образом:

import httplib2
from bs4 import BeautifulSoup
import subprocess
import time, wget
import os, os.path

#declarations
catRoot = "http://en.wikipedia.org/wiki/Category:"
MAX_DEPTH = 100
done = []
ignore = []
path = 'trivial'
#Removes all newline characters and replaces with spaces
def removeNewLines(in_text):
return in_text.replace('\n', ' ')

# Downloads a link into the destination
def download(link, dest):
# print link
if not os.path.exists(dest) or os.path.getsize(dest) == 0:
    subprocess.getoutput('wget "' + link + '" -O "' + dest+ '"')    
    print ("Downloading")
def ensureDir(f):
    if not os.path.exists(f):
        os.mkdir(f)

# Cleans a text by removing tags
def clean(in_text):
    s_list = list(in_text)
    i,j = 0,0
    while i < len(s_list):
#iterate until a left-angle bracket is found
        if s_list[i] == '<':
            if s_list[i+1] == 'b' and s_list[i+2] == 'r' and s_list[i+3] == '>':
                i=i+1
                print ("hello")
                continue               
            while s_list[i] != '>':
#pop everything from the the left-angle bracket until the right-angle bracket
                s_list.pop(i)
#pops the right-angle bracket, too
            s_list.pop(i)

        elif s_list[i] == '\n':
            s_list.pop(i)
        else:
            i=i+1        
#convert the list back into text
join_char=''
return (join_char.join(s_list))#.replace("<br>","\n")

def getBullets(content):
    mainSoup = BeautifulSoup(contents, "html.parser")

# Gets empty bullets
def getAllBullets(content):
    mainSoup = BeautifulSoup(str(content), "html.parser")
    subcategories = mainSoup.findAll('div',attrs={"class" : "CategoryTreeItem"})
    empty = []
    full = []
    for x in subcategories:
        subSoup = BeautifulSoup(str(x))
        link = str(subSoup.findAll('a')[0])
        if (str(x)).count("CategoryTreeEmptyBullet") > 0:
            empty.append(clean(link).replace(" ","_"))
        elif (str(x)).count("CategoryTreeBullet") > 0:
            full.append(clean(link).replace(" ","_"))

    return((empty,full))

def printTree(catName, count):
    catName = catName.replace("\\'","'")
    if count == MAX_DEPTH : return
    download(catRoot+catName, path)
    filepath = "categories/Category:"+catName+".html" 

    print(filepath) 
    content = open('filepath', 'w+')

    content.readlines()
    (emptyBullets,fullBullets) = getAllBullets(content)
    f.close()
    for x in emptyBullets:
        for i in range(count): 
          print ("  "),
    download(catRoot+x, "categories/Category:"+x+".html")
    print (x)
    for x in fullBullets:
      for i in range(count): 
          print ("  "),
      print (x)
      if x in done:
         print ("Done... "+x)
         continue
      done.append(x)
      try: printTree(x, count + 1)        
      except: 
          print ("ERROR: " + x)
name = "Cricket"
printTree(name, 0)

Произошла следующая ошибка:

enter image description here

1 Ответ

0 голосов
/ 05 октября 2018

Я думаю, f.close() должно быть content.close().

Обычно в таких случаях используется менеджер контекста, например, так:

with open(filepath, 'w+') as content:
    (emptyBullets,fullBullets) = getAllBullets(content)

Тогда Python закроетфайл для вас, даже в случае исключения.

(я также изменил 'filepath' на filepath, что, как я предполагаю, является намерением здесь.)

...