web_page.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import logging
  2. import requests
  3. from bs4 import BeautifulSoup
  4. from embedchain.loaders.base_loader import BaseLoader
  5. from embedchain.utils import clean_string
  6. class WebPageLoader(BaseLoader):
  7. def load_data(self, url):
  8. """Load data from a web page."""
  9. response = requests.get(url)
  10. data = response.content
  11. soup = BeautifulSoup(data, "html.parser")
  12. original_size = len(str(soup.get_text()))
  13. tags_to_exclude = [
  14. "nav",
  15. "aside",
  16. "form",
  17. "header",
  18. "noscript",
  19. "svg",
  20. "canvas",
  21. "footer",
  22. "script",
  23. "style",
  24. ]
  25. for tag in soup(tags_to_exclude):
  26. tag.decompose()
  27. ids_to_exclude = ["sidebar", "main-navigation", "menu-main-menu"]
  28. for id in ids_to_exclude:
  29. tags = soup.find_all(id=id)
  30. for tag in tags:
  31. tag.decompose()
  32. classes_to_exclude = [
  33. "elementor-location-header",
  34. "navbar-header",
  35. "nav",
  36. "header-sidebar-wrapper",
  37. "blog-sidebar-wrapper",
  38. "related-posts",
  39. ]
  40. for class_name in classes_to_exclude:
  41. tags = soup.find_all(class_=class_name)
  42. for tag in tags:
  43. tag.decompose()
  44. content = soup.get_text()
  45. content = clean_string(content)
  46. cleaned_size = len(content)
  47. if original_size != 0:
  48. logging.info(
  49. f"[{url}] Cleaned page size: {cleaned_size} characters, down from {original_size} (shrunk: {original_size-cleaned_size} chars, {round((1-(cleaned_size/original_size)) * 100, 2)}%)" # noqa:E501
  50. )
  51. meta_data = {
  52. "url": url,
  53. }
  54. return [
  55. {
  56. "content": content,
  57. "meta_data": meta_data,
  58. }
  59. ]