cazyundee commited on
Commit
176dfd1
·
verified ·
1 Parent(s): 4485c4c

Use duckduckgo_search package

Browse files
Files changed (1) hide show
  1. app.py +26 -39
app.py CHANGED
@@ -205,47 +205,34 @@ def _get_runtime_specs():
205
 
206
 
207
  # ---------------------------------------------------------------------------
208
- # Web search (DuckDuckGo HTML scraping, no API key required)
209
  # ---------------------------------------------------------------------------
210
 
211
- import re as _re
212
-
213
-
214
- def _search_web(query, max_results=10):
215
- """Search the web via DuckDuckGo HTML endpoint."""
216
- url = f"https://html.duckduckgo.com/html/?{urllib.parse.urlencode({'q': query})}"
217
- req = urllib.request.Request(url, headers={
218
- "User-Agent": "Mozilla/5.0 (compatible; RespiteAPI/1.0)",
219
- })
220
- resp = urllib.request.urlopen(req, timeout=10)
221
- html = resp.read().decode("utf-8", errors="replace")
222
-
223
- results = []
224
- # Extract search results from DuckDuckGo HTML
225
- for match in _re.finditer(
226
- r'<a[^>]+class="result__a"[^>]*href="([^"]+)"[^>]*>(.+?)</a>.*?'
227
- r'<a[^>]+class="result__snippet"[^>]*>(.*?)</a>',
228
- html, _re.DOTALL,
229
- ):
230
- if len(results) >= max_results:
231
- break
232
- raw_url = match.group(1)
233
- title = _re.sub(r'<[^>]+>', '', match.group(2)).strip()
234
- snippet = _re.sub(r'<[^>]+>', '', match.group(3)).strip()
235
- # DuckDuckGo wraps URLs in a redirect; extract the real URL
236
- ud_match = _re.search(r'uddg=([^"&]+)', raw_url)
237
- real_url = urllib.parse.unquote(ud_match.group(1)) if ud_match else raw_url
238
- results.append({
239
- "title": title,
240
- "url": real_url,
241
- "content": snippet,
242
- })
243
-
244
- return {
245
- "query": query,
246
- "results": results,
247
- "total_results": len(results),
248
- }
249
 
250
 
251
  # ---------------------------------------------------------------------------
 
205
 
206
 
207
  # ---------------------------------------------------------------------------
208
+ # Web search (DuckDuckGo, no API key required)
209
  # ---------------------------------------------------------------------------
210
 
211
+ try:
212
+ from duckduckgo_search import DDGS
213
+
214
+ def _search_web(query, max_results=10):
215
+ """Search the web via DuckDuckGo."""
216
+ with DDGS() as ddgs:
217
+ hits = list(ddgs.text(query, max_results=max_results))
218
+ results = []
219
+ for r in hits:
220
+ results.append({
221
+ "title": r.get("title", ""),
222
+ "url": r.get("href", ""),
223
+ "content": r.get("body", ""),
224
+ })
225
+ return {
226
+ "query": query,
227
+ "results": results,
228
+ "total_results": len(results),
229
+ }
230
+
231
+ except ImportError:
232
+ _log("Warning: duckduckgo_search not installed, search disabled")
233
+
234
+ def _search_web(query, max_results=10):
235
+ raise RuntimeError("Search not available: duckduckgo_search not installed")
 
 
 
 
 
 
 
 
 
 
 
 
 
236
 
237
 
238
  # ---------------------------------------------------------------------------