Update wiki.py

Fixed Non-Prose Content Clutter
Fixed Encoding/Mojibake Issue

These changes ensure that when users run a local Kiwix server with useKiwixServer = True, they'll receive clean, properly-encoded article summaries

https: //github.com/SpudGunMan/meshing-around/issues/334
Co-Authored-By: va3vbe <209848734+va3vbe@users.noreply.github.com>
This commit is contained in:
Kellyandva3vbe committed 2026-08-18 19:17:19 -07:00
1 parent 2bae1b98ba
commit 1cf63f40fe
1 file changed
+17
+17
View File
@@ -26,6 +26,21 @@ def text_from_html(body):
main = soup.body main = soup.body
if not main: if not main:
return "" return ""
# Remove non-prose elements that pollute the summary: infoboxes,
# hatnotes/redirect notices, navigation boxes, citation markers, edit links.
for unwanted in main.select('table.infobox, table.sidebar, div.hatnote, div.navbox, div.metadata, sup.reference, .mw-editsection'):
unwanted.decompose()
# Prefer extracting from <p> tags (actual lead paragraphs)
paragraphs = main.find_all('p')
if paragraphs:
texts = [p.get_text(" ", strip=True) for p in paragraphs]
texts = [t for t in texts if t]
if texts:
return " ".join(texts)
# Fallback to existing full-text behavior if no <p> tags found
texts = main.find_all(string=True) texts = main.find_all(string=True)
visible_texts = filter(tag_visible, texts) visible_texts = filter(tag_visible, texts)
return " ".join(t.strip() for t in visible_texts if t.strip()) return " ".join(t.strip() for t in visible_texts if t.strip())
@@ -49,6 +64,8 @@ def get_kiwix_summary(search_term, truncate=True):
continue continue
article_url = f"{kiwix_url}{a['href']}" article_url = f"{kiwix_url}{a['href']}"
article_response = requests.get(article_url, timeout=urlTimeoutSeconds) article_response = requests.get(article_url, timeout=urlTimeoutSeconds)
# Force UTF-8 encoding to avoid mojibake on multi-byte characters
article_response.encoding = 'utf-8'
if article_response.status_code == 200: if article_response.status_code == 200:
text = text_from_html(article_response.text) text = text_from_html(article_response.text)
# Remove navigation and search jump text # Remove navigation and search jump text