feat: web.py search() over SearXNG json API
This commit is contained in:
19
web.py
19
web.py
@@ -57,3 +57,22 @@ def _request(url, *, data=None, headers=None, timeout=30, retries=2, backoff=1.5
|
||||
if attempt < retries:
|
||||
time.sleep(backoff ** attempt)
|
||||
raise WebToolsError(f"request failed after {retries + 1} attempt(s): {url}: {last}")
|
||||
|
||||
|
||||
def search(query, max_results=12, timeout=30):
|
||||
"""Query SearXNG and return up to max_results normalized hits."""
|
||||
searx_base, _ = endpoints()
|
||||
qs = urllib.parse.urlencode({"q": query, "format": "json"})
|
||||
payload = _request(f"{searx_base}/search?{qs}", timeout=timeout)
|
||||
hits = []
|
||||
for r in payload.get("results", []):
|
||||
url = r.get("url")
|
||||
if not url:
|
||||
continue
|
||||
hits.append({
|
||||
"title": r.get("title", ""),
|
||||
"url": url,
|
||||
"snippet": r.get("content", ""),
|
||||
"engine": r.get("engine", ""),
|
||||
})
|
||||
return hits[:max_results]
|
||||
|
||||
Reference in New Issue
Block a user