import pywikibot
import mwparserfromhell
#função que faz os últimos acertos na sentença antes de jogá-la para a lista
def tratamento_final(sentence):
#sentenças que terminem com </ref> significa que são parte de uam tag
#de referência, que não deve ser utilizada
if sentence[-6:] == "</ref>":
sentence = ""
#caso haja uma tag <ref> significa que o parser não conseguiu removê-la
#e que ela está incompleta, por isso é removido todo conteúdo após ela
pos = sentence.find("<ref")
if pos != -1:
sentence = sentence[:pos]
#remove alguns caracteres que ainda estão sobrando
to_remove = ["]]", "\n"]
for word in to_remove:
sentence = sentence.replace(word, "")
#remove sentenças que contenham pipe, significando que existem tags
#que não puderam ser removidas por nenhum processo anterior
if sentence.find("|") != -1:
sentence = ""
####este código removia as pontuações no fim das sentenças
####if len(sentence) > 0 and sentence[-1] in [".", ",", ";", ":", "."]:
#### sentence = sentence[:-1]
#retorna com um trim para garantir que está sem espaços
return sentence.strip()
#definindo o domínio que o pywikibot usará para trabalhar
site = pywikibot.Site("en", "wikipedia")
#buscando todas as páginas que contenham a template Dubious
pages = pywikibot.Page(site, "Template:Dubious").getReferences(namespaces = 0)
sentences = []
stats = {"pages": 0, "templates": 0}
for page in pages:
stats["pages"] += 1
####if stats["pages"] == 100:
#### break
#guardando o conteúdo da página em uma variável
content = page.text
#iniciando as variáveis de controle...
pos = -1
templates_founded = 0
while True:
#encontra a posicao em que está a marcação dentro do conteúdo
pos = content.lower().find("{{dubious", pos + 1)
#se a tag dubious não for encontrada (ou não haja mais tags no texto)
if pos == -1:
if templates_founded > 0:
#caso o texto possua alguma tag dubious, é guardado nas estatísticas
#quantas vezes ela apareceu dentro do texto
if str(templates_founded) + "x" not in stats:
stats[str(templates_founded) + "x"] = 0
stats[str(templates_founded) + "x"] += 1
break
#se a tag dubious for encontrada, então o tratamento começa
else:
templates_founded += 1
stats["templates"] += 1
#a partir da posição da tag dubious, é procurada a primeira
#ocorrência anterior de uma das strings de parada
i = pos - 10 #-10 para evitar frases curtíssimas
dot_pos = -1
while True:
#string de parada: ponto com espaço
if content[i:i+2] == ". " and content[i:i+4] != ". {{":
dot_pos = i + 1
break
#string de parada: ponto com quebra de linha
if content[i:i+2] == ".\n":
dot_pos = i + 1
break
#string de parada: ponto abertura de tag
if content[i:i+2] == ".<":
dot_pos = i + 1
break
#string de parada: fechamento de uma tag de referência
elif content[i:i+6] == "</ref>":
dot_pos = i + 6
break
#string de parada: fim de uma tag de cabeçalho
elif content[i:i+3] == "==\n":
dot_pos = i + 3
break
#string de parada: fechamento de uma tag de referência
elif content[i:i+3] == ".]]":
dot_pos = i + 3
break
#string de parada: fechamento de uma tag de referência
elif content[i:i+3] == "]]\n":
dot_pos = i + 3
break
#string de parada: fechamento de uma tag genêrica
elif content[i:i+3] == "}}\n":
dot_pos = i + 3
break
i -= 1
#se nenhuma string de parada for encontrada, encerra o loop
if i < 0:
break
#caso seja encontrada uma sentença válida, guarda na lista
if dot_pos != -1:
#pega o trecho correspondente à sentença a partir das posições encontradas
#usando strip para remover espaços vazios no início e no final
sentence = content[dot_pos:pos].strip()
#usando o mwparserfromhell para remover todas as formatações possíveis
wikicode = mwparserfromhell.parse(sentence)
sentence = tratamento_final(wikicode.strip_code())
#somente as sentenças com o comprimento maior que 1 vão para a lista, para
#elimiar algumas sentenças que contém apenas um ponto
if len(sentence) > 1:
sentences.append(sentence)
#exibe as estatísticas
print(stats)
####i = 0
####for sentence in sentences:
#### i += 1
#### print('---- ', i, ' -----\n', sentence, '\n')
{'pages': 5541, 'templates': 6480, '1x': 4829, '2x': 459, '3x': 110, '5x': 19, '11x': 3, '4x': 36, '16x': 1, '7x': 2, '6x': 7, '10x': 2, '13x': 1, '8x': 1, '9x': 2}
#inicia o arquivo em modo de escrita
arquivo = open("sentencas.txt", "w")
for sentence in sentences:
#escreve cada sentença em uma linha do arquivo
arquivo.write(sentence + "\n")
#fecha o arquivo
arquivo.close()