summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.py8
-rw-r--r--src/scrape_lexicanum.py21
2 files changed, 24 insertions, 5 deletions
diff --git a/src/main.py b/src/main.py
index a50e233..c531faa 100644
--- a/src/main.py
+++ b/src/main.py
@@ -34,7 +34,8 @@ async def help(ctx):
@bot.command(name="Explain", aliases=["explain", "What's", "what's", "whats"])
async def explain(ctx, *args):
config["site"] = "https://ageofsigmar.lexicanum.com"
-
+ api_root = "/mediawiki"
+
include_image = True
include_links = True
@@ -49,6 +50,9 @@ async def explain(ctx, *args):
config["site"] = "https://wh40k.lexicanum.com"
case "!aos":
config["site"] = "https://ageofsigmar.lexicanum.com"
+ case "!experimental-wod":
+ config["site"] = "https://whitewolf.fandom.com"
+ api_root = ""
case "!noimage":
include_image = False
case "!nolinks":
@@ -58,7 +62,7 @@ async def explain(ctx, *args):
query = " ".join([x.replace('"', "") for x in args])
try:
- search_content = scrape_lexicanum.get_search_response(config, query)
+ search_content = scrape_lexicanum.get_search_response(config, api_root, query)
page_header, page_content, page_img_link = scrape_lexicanum.get_page_content(config, search_content[0])
embed = discord.Embed(
diff --git a/src/scrape_lexicanum.py b/src/scrape_lexicanum.py
index f4cb071..d55f58b 100644
--- a/src/scrape_lexicanum.py
+++ b/src/scrape_lexicanum.py
@@ -1,6 +1,7 @@
from bs4 import BeautifulSoup
from markdownify import markdownify
from requests.exceptions import HTTPError
+from urllib.parse import urlparse
import requests
import textwrap
@@ -16,9 +17,9 @@ def decompose(node, field):
for unwanted in node.select(field):
unwanted.decompose()
-def get_search_response(config, query):
+def get_search_response(config, api_root, query):
try:
- response = requests.get(config['site'] + '/mediawiki/api.php?action=opensearch&format=json&formatversion=2&search=' + query + '&namespace=0&limit=6&suggest=true', timeout=7)
+ response = requests.get(config['site'] + api_root + '/api.php?action=opensearch&format=json&formatversion=2&search=' + query + '&namespace=0&limit=6&suggest=true', timeout=7)
except requests.exceptions.Timeout:
raise WikiError("Request timed out.")
except requests.exceptions.RequestException as e:
@@ -55,7 +56,7 @@ def get_page_content(config, page_name):
soup = BeautifulSoup(response.content, "html.parser")
- parser_output = soup.find(id="mw-content-text").contents[0]
+ parser_output = soup.select_one(".mw-parser-output")
decompose(parser_output, "sup")
decompose(parser_output, "div.portal")
@@ -75,8 +76,19 @@ def get_page_content(config, page_name):
fix_link(config, image.contents[0], "src")
image_link = image.contents[0]["src"]
+ try:
+ result = urlparse(image_link)
+
+ if not result.netloc:
+ fix_link(config, image.contents[0], "data-src")
+ image_link = image.contents[0]["data-src"]
+ except ValueError:
+ fix_link(config, image.contents[0], "data-src")
+ image_link = image.contents[0]["data-src"]
+
decompose(parser_output, "br")
decompose(parser_output, "table")
+ decompose(parser_output, "aside")
for p in parser_output.find_all("p"):
if not p.get_text(strip=True):
@@ -87,6 +99,9 @@ def get_page_content(config, page_name):
fix_link(config, a, "href")
header_md = markdownify(str(soup.find(id="firstHeading").contents[0]))
+ if not header_md:
+ header_md = markdownify(str(soup.select_one(".mw-page-title-main")))
+
content_md = textwrap.shorten(markdownify(str(content)), width=1000, placeholder="...")
return header_md, content_md, image_link