In [18]:
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()
In [19]:
#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)
In [20]:
#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}
In [21]:
#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()