pypi.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. """pypi.org
  3. """
  4. from urllib.parse import urlencode
  5. from dateutil import parser
  6. from lxml import html
  7. from searx.utils import (
  8. eval_xpath_getindex,
  9. eval_xpath_list,
  10. extract_text,
  11. )
  12. # about
  13. about = {
  14. "website": "https://pypi.org",
  15. "wikidata_id": "Q2984686",
  16. "official_api_documentation": "https://warehouse.readthedocs.io/api-reference/index.html",
  17. "use_official_api": False,
  18. "require_api_key": False,
  19. "results": "HTML",
  20. }
  21. categories = ['it', 'packages']
  22. # engine dependent config
  23. first_page_num = 1
  24. base_url = "https://pypi.org"
  25. search_url = base_url + '/search/?{query}'
  26. def request(query, params):
  27. args = {
  28. "q": query,
  29. "page": params['pageno'],
  30. }
  31. params['url'] = search_url.format(query=urlencode(args))
  32. return params
  33. def response(resp):
  34. results = []
  35. dom = html.fromstring(resp.text)
  36. for entry in eval_xpath_list(dom, '/html/body/main/div/div/div/form/div/ul/li/a[@class="package-snippet"]'):
  37. url = base_url + extract_text(eval_xpath_getindex(entry, './@href', 0)) # type: ignore
  38. title = extract_text(eval_xpath_getindex(entry, './h3/span[@class="package-snippet__name"]', 0))
  39. version = extract_text(eval_xpath_getindex(entry, './h3/span[@class="package-snippet__version"]', 0))
  40. created_at = extract_text(
  41. eval_xpath_getindex(entry, './h3/span[@class="package-snippet__created"]/time/@datetime', 0)
  42. )
  43. content = extract_text(eval_xpath_getindex(entry, './p', 0))
  44. results.append(
  45. {
  46. "template": "packages.html",
  47. "url": url,
  48. "title": title,
  49. 'package_name': title,
  50. "content": content,
  51. "version": version,
  52. 'publishedDate': parser.parse(created_at), # type: ignore
  53. }
  54. )
  55. return results