跳转到内容

User:Willy1018/處理簡繁頁面不一致問題

维基百科,自由的百科全书
import pywikibot
from opencc import OpenCC

site = pywikibot.Site('zh', 'wikipedia')
cc_to_simp = OpenCC('t2s')
cc_to_trad = OpenCC('s2t')

checked = set()
results = {
    'type1': [],#純簡繁差異,兩者皆非重新導向(
    'type2': [],#純簡繁差異,一為重新導向,但非至另一頁
    'type3': []#純簡繁差異,兩者皆為重新導向,但分別連至兩頁
}

def is_redirect_to(page, target_title):
    try:
        if not page.isRedirectPage():
            return False
        return page.getRedirectTarget().title(with_ns=False) == target_title
    except:
        return False

def check_title(title):
    title_simp = cc_to_simp.convert(title)
    title_trad = cc_to_trad.convert(title)

    if title_simp == title_trad:
        return

    key = tuple(sorted([title_simp, title_trad]))
    if key in checked:
        return
    checked.add(key)

    try:
        page_simp = pywikibot.Page(site, title_simp)
        page_trad = pywikibot.Page(site, title_trad)

        if not (page_simp.exists() and page_trad.exists()):
            return

        simp_redir = page_simp.isRedirectPage()
        trad_redir = page_trad.isRedirectPage()

        if not simp_redir and not trad_redir:
            results['type1'].append((title_simp, title_trad))
        elif simp_redir != trad_redir:
            redir_page = page_simp if simp_redir else page_trad
            other_title = title_trad if simp_redir else title_simp
            if not is_redirect_to(redir_page, other_title):
                results['type2'].append((title_simp, title_trad))
        elif simp_redir and trad_redir:
            simp_target = page_simp.getRedirectTarget().title()
            trad_target = page_trad.getRedirectTarget().title()
            if simp_target != trad_target:
                results['type3'].append((title_simp, title_trad))
    except Exception as e:
        print(f'Error with {title}: {e}')

for page in site.allpages(namespace=0, total=5000):
    check_title(page.title())

for k, v in results.items():
    if not v:
        continue
    print(f'\n== {k} 類型問題頁面 ==')
    print('{| class="wikitable sortable"')
    print('! 簡體標題 !! 編輯 !! 繁體標題 !! 編輯')
    for a, b in sorted(set(v)):
         print(f'|-\n| [[{a}]] || {{{{Edit|1={a}}}}} || [[{b}]] || {{{{Edit|1={b}}}}}')
    print('|}')

輸出:

type2 類型問題頁面

[编辑]
簡體標題 編輯 繁體標題 編輯
115师 [编辑] 115師 [编辑]

type3 類型問題頁面

[编辑]
簡體標題 編輯 繁體標題 編輯
020国道 [编辑] 020國道 [编辑]