py2ls 0.1.10.0__tar.gz → 0.1.10.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/PKG-INFO +1 -1
  2. py2ls-0.1.10.1/py2ls/.git/COMMIT_EDITMSG +1 -0
  3. py2ls-0.1.10.1/py2ls/.git/FETCH_HEAD +1 -0
  4. py2ls-0.1.10.1/py2ls/.git/index +0 -0
  5. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/logs/HEAD +1 -0
  6. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/logs/refs/heads/main +1 -0
  7. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/logs/refs/remotes/origin/HEAD +1 -0
  8. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/logs/refs/remotes/origin/main +1 -0
  9. py2ls-0.1.10.1/py2ls/.git/objects/27/aa6074f652bc6f7078f8647489d9ee8e24f0e2 +0 -0
  10. py2ls-0.1.10.1/py2ls/.git/objects/28/c2969d785c1b892c2a96b3f00eba63a59811b3 +0 -0
  11. py2ls-0.1.10.1/py2ls/.git/objects/2a/fdf45791a26d42ccead35ace76a8f0b2a56561 +0 -0
  12. py2ls-0.1.10.1/py2ls/.git/objects/34/b6f3a2ee84f39bed4eee57f2c0e0afb994feb1 +0 -0
  13. py2ls-0.1.10.1/py2ls/.git/objects/35/1a5f491ab97eee9d1ee699478d75a8bb5d3dc2 +0 -0
  14. py2ls-0.1.10.1/py2ls/.git/objects/39/b13be65125556784e44c7a1d9821703c7ab67e +0 -0
  15. py2ls-0.1.10.1/py2ls/.git/objects/3b/507acc7f23391644cc0b824b1e79fd2677a362 +0 -0
  16. py2ls-0.1.10.1/py2ls/.git/objects/3d/9d10d27724657a436c65a6254bfd213d4b3562 +0 -0
  17. py2ls-0.1.10.1/py2ls/.git/objects/47/6cbd5a7c5e35cddef2f8a38bdc4896d403b095 +0 -0
  18. py2ls-0.1.10.1/py2ls/.git/objects/78/063f4c863fc371ec0313303c0a81283b35d9b6 +0 -0
  19. py2ls-0.1.10.1/py2ls/.git/objects/82/70b319ce4046854fbe7dc41054b6c2d112dab2 +0 -0
  20. py2ls-0.1.10.1/py2ls/.git/objects/85/aee46f478e9afdb84d50a05242c53b04ed2e21 +0 -0
  21. py2ls-0.1.10.1/py2ls/.git/objects/86/e288b46f8fe179907e4413f665aeb5053fddb1 +0 -0
  22. py2ls-0.1.10.1/py2ls/.git/objects/94/f7dbe88e80c4205a901b71eb8f181974376bba +0 -0
  23. py2ls-0.1.10.1/py2ls/.git/objects/9b/ec5ee2236ee2d5532c36bfd132e23c58fdb69c +0 -0
  24. py2ls-0.1.10.1/py2ls/.git/objects/b3/4f7f271c6d6105e35a6556ffda71d03afe8c96 +0 -0
  25. py2ls-0.1.10.1/py2ls/.git/objects/b3/69579064bde9de9a19d114fc33e4e48cc8c0e4 +0 -0
  26. py2ls-0.1.10.1/py2ls/.git/objects/bf/b54d65922ce1dfda1aaa014913a54e7172d0bc +0 -0
  27. py2ls-0.1.10.1/py2ls/.git/objects/c1/397c6ed72c4e20ef6b9ab83163e9a6baba5b45 +0 -0
  28. py2ls-0.1.10.1/py2ls/.git/objects/cc/45df1d317a2eb63ff1ff3a5f3b4a9f98fd92b5 +0 -0
  29. py2ls-0.1.10.1/py2ls/.git/objects/d6/39e8af592cd75a318d8affddd1bcc70c2095f2 +0 -0
  30. py2ls-0.1.10.1/py2ls/.git/objects/db/3f2cd643292057936230b95cf7ec3046affe11 +0 -0
  31. py2ls-0.1.10.1/py2ls/.git/objects/de/214c626ac2dd2685bfaa0bc0fc20f528d014d7 +0 -0
  32. py2ls-0.1.10.1/py2ls/.git/objects/e4/6c715352db9fe3c887a635f1916df4ca1f4ff9 +0 -0
  33. py2ls-0.1.10.1/py2ls/.git/objects/e5/0580a0bd1e1b3d29f834382b80fceb61d5cf0c +0 -0
  34. py2ls-0.1.10.1/py2ls/.git/objects/ec/d980279432b13f0374b90ca439a6329cdece0f +0 -0
  35. py2ls-0.1.10.1/py2ls/.git/objects/ee/cee64eacaff022dcdc509c0c2b1da492f21060 +0 -0
  36. py2ls-0.1.10.1/py2ls/.git/objects/f5/61c3c1bf1c9ea9c9d1f556a7be2869f71f3bdf +0 -0
  37. py2ls-0.1.10.1/py2ls/.git/refs/heads/main +1 -0
  38. py2ls-0.1.10.1/py2ls/.git/refs/remotes/origin/main +1 -0
  39. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/batman.py +62 -47
  40. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/ips.py +1 -1
  41. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/netfinder.py +100 -1
  42. py2ls-0.1.10.1/py2ls/ocr.py +557 -0
  43. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/plot.py +24 -0
  44. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/pyproject.toml +1 -1
  45. py2ls-0.1.10.0/py2ls/.git/COMMIT_EDITMSG +0 -1
  46. py2ls-0.1.10.0/py2ls/.git/FETCH_HEAD +0 -1
  47. py2ls-0.1.10.0/py2ls/.git/index +0 -0
  48. py2ls-0.1.10.0/py2ls/.git/refs/heads/main +0 -1
  49. py2ls-0.1.10.0/py2ls/.git/refs/remotes/origin/main +0 -1
  50. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/README.md +0 -0
  51. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.DS_Store +0 -0
  52. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/HEAD +0 -0
  53. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/config +0 -0
  54. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/description +0 -0
  55. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/applypatch-msg.sample +0 -0
  56. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/commit-msg.sample +0 -0
  57. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/fsmonitor-watchman.sample +0 -0
  58. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/post-update.sample +0 -0
  59. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-applypatch.sample +0 -0
  60. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-commit.sample +0 -0
  61. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-merge-commit.sample +0 -0
  62. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-push.sample +0 -0
  63. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-rebase.sample +0 -0
  64. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/pre-receive.sample +0 -0
  65. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/prepare-commit-msg.sample +0 -0
  66. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/push-to-checkout.sample +0 -0
  67. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/hooks/update.sample +0 -0
  68. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/info/exclude +0 -0
  69. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/01/d5bd8065e6860c0bd23ff9fa57161806a099e1 +0 -0
  70. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/09/08da26de58c114225ad81f484b80bf5d351b34 +0 -0
  71. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/0b/409e1bc918277010f5679b402d1d1dda53e15c +0 -0
  72. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/12/c2808a1b3a4d0892a4154dfba1e2ae3770fa73 +0 -0
  73. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/14/449a0e6ba4ea2f1a73acf63ef91c9c6193f9ed +0 -0
  74. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/15/a8e468aacfcb440e090020f36d0b985d45da23 +0 -0
  75. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/1a/b4585881a6a42889f01aa0cfe25fd5acfaf46f +0 -0
  76. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/1c/3f92adda34344bcbbbf9d409c79855ae2aaea8 +0 -0
  77. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/1c/9314c5f69b9390068a2a8616875d974849d71f +0 -0
  78. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/1d/fe9d9633b24ea560354f4f93d39c6e5f163ea0 +0 -0
  79. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/20/72c28e83f4347959d29f7b3a6c1fc3e4ee6b59 +0 -0
  80. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/24/6b368b986f758630c46dc02b7fa512b53422f7 +0 -0
  81. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/25/b796accd261b9135fd32a2c00785f68edf6c46 +0 -0
  82. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/2a/ae95d517d213b660bf4f65a4e0cfae7bb893eb +0 -0
  83. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/30/a2f8da47ee947811dc8d993f5a06a45de374f4 +0 -0
  84. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/32/fd627b62fad7cf3b2f9e34ab9777126a0987ad +0 -0
  85. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/34/9e31b6a3634cea102ce5588b98c11cc1738605 +0 -0
  86. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/36/b4a1b7403abc6c360f8fe2cb656ab945254971 +0 -0
  87. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/36/e56a361f526eafa59c5235a5c990bf288b5f9c +0 -0
  88. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/36/ef43e50009e59db11812c258846d9e38718173 +0 -0
  89. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/39/7ead045fbbcfb17c62019eb18fe21ed05dbee5 +0 -0
  90. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/3b/bd972aa7ad680858f8dfbd0f7fcd97756f0d6f +0 -0
  91. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/3c/bbe5f4173d165127b9ad96119f1ec24c306ffc +0 -0
  92. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/3f/d6561300938afbb3d11976cf9c8f29549280d9 +0 -0
  93. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/41/dcf4b3bf0460946b2da93776cf9e836d62178f +0 -0
  94. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/43/dbd49b2ee367c5434dd545e3b5795434f2ef0b +0 -0
  95. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/45/b1b6178bacbfc997811a998b5cc60c1ea7fac8 +0 -0
  96. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/48/a88fc5806305d0bb0755ee6801161b79696972 +0 -0
  97. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/4f/7afb40dff2153d857fc85748c2eecb85125042 +0 -0
  98. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/50/08ddfcf53c02e82d7eee2e57c38e5672ef89f6 +0 -0
  99. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/53/e0deb1cb4c2c606bced6e7f9a66b0fda60980d +0 -0
  100. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/56/e4e8b2d5545e0256090f45aa8fc42c5fe067d0 +0 -0
  101. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/57/63d0c52f5c9c69e89d514a1f96034947abe21a +0 -0
  102. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/57/bd1c0199483ab316235b094543b85edec6c35e +0 -0
  103. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/58/20a729045d4dc7e37ccaf8aa8eec126850afe2 +0 -0
  104. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/59/380c4c26bdcd4d9b71ae3e2e35f05b3f26c5ab +0 -0
  105. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/5a/192565abf89c9d765af846ce6d53a92b1ce7ad +0 -0
  106. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/60/f273eb1c412d916fa3f11318a7da7a9911b52a +0 -0
  107. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/61/570cec8c061abe74121f27f5face6c69b98f99 +0 -0
  108. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/62/4488173ed2c8936fa5cea3cf5dd3f26a30b86e +0 -0
  109. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/62/7c81b23b4e56e87b042b650b0103653cc9e34a +0 -0
  110. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/62/d90ccf8cbefdc2e4fd475e7c6f4f76e9fdf801 +0 -0
  111. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/63/100154b27846e8010e55b6bf4b3d7762c14c5f +0 -0
  112. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/64/27a4edff08f93d98f511418423f09f2ab90bcd +0 -0
  113. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/66/6227eeeba24073e63811e89f1449f3d958f183 +0 -0
  114. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/66/c998778721d424bd0aae80602dabbffa93af2e +0 -0
  115. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/68/6df3072c8b025fb18106ed2df505994ad062a9 +0 -0
  116. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/69/13c452ca319f7cbf6a0836dc10a5bb033c84e4 +0 -0
  117. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/6a/52e747a2b349b128d1490d9e896d2323818eb7 +0 -0
  118. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/6b/7fde264d93a7a0986d394c46c7650d0ce2ab92 +0 -0
  119. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/6c/cebb29b7f3f5b0c889f6dadbf9ff066554587d +0 -0
  120. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/6d/c2cdf4a84e538e5d4777486aeff87e42f41799 +0 -0
  121. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/6d/ee29dbdcc84edeeacede105110446f3ccac963 +0 -0
  122. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/71/36b2074a2754be8b58127d82250e5b37e3c373 +0 -0
  123. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/72/245a05b0966011cb381e6b32b0465000e969ab +0 -0
  124. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/72/e4179337639859678ddaecf38b16f33aaec8e1 +0 -0
  125. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/78/3d4167bc95c9d2175e0df03ef1c1c880ba75ab +0 -0
  126. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/79/7ae089b2212a937840e215276005ce76881307 +0 -0
  127. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/7e/5956c806b5edc344d46dab599dec337891ba1f +0 -0
  128. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/81/8f26b7bf042269729020cf944fc362d66ba27e +0 -0
  129. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/84/59071b722a255b774a80b27746033f8141ab39 +0 -0
  130. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/87/ef1fc3f7f1ddc4d0ab9b3e65381ce9f3388621 +0 -0
  131. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/8b/84f56978e1de8f2ae82abce5f8b3e182d365cd +0 -0
  132. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/8e/55a7d2b96184030211f20c9b9af201eefcac82 +0 -0
  133. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/91/c69ad88fe0ba94aa7859fb5f7edac5e6f1a3f7 +0 -0
  134. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/94/74152b4b463d70ae5ad07f0c658be3e296026b +0 -0
  135. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/97/1aef09ea939f46b60b9646f8d524c78a9220f4 +0 -0
  136. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/9d/0df52899fe95279059286d9c0ec42287edc168 +0 -0
  137. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/a1/5389729850729fc7bd78a54f26fce77f30be12 +0 -0
  138. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/a1/906da89d1174f74867800c74c43af36253bd5e +0 -0
  139. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/a4/63fdd23e5efd713db8a71f316f3a1c7bd60916 +0 -0
  140. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/a5/ec8f74642fbba27f7ea78c53b372ae0c7dedce +0 -0
  141. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/a7/3e13eafee65c5b8d73ad2d3ea46d0eee82f0d3 +0 -0
  142. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/b0/56be4be89ba6b76949dd641df45bb7036050c8 +0 -0
  143. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/b0/9cd7856d58590578ee1a4f3ad45d1310a97f87 +0 -0
  144. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/b2/18e6a0f0f1c4df8cdefa9852058348abc713b7 +0 -0
  145. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/b5/61831c7dce8ea51e7ee6b6fa35745f14d8242d +0 -0
  146. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/b7/2c9e75ab7d0afe594664650aa8f6c772f5ac64 +0 -0
  147. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/bb/81ccc0513f18fc160b54a82861e9a80d23f4f6 +0 -0
  148. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/bb/934eb33bc1a8b85630bf680caffd99560c1b8f +0 -0
  149. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/bf/67907e337021ebff434e02b19b30a741c144af +0 -0
  150. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/c1/20fc812b9ad311c34a3608512d6a9d976bb48e +0 -0
  151. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/c4/cba65f1163661999ee4b8ed23342b63bc1300c +0 -0
  152. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/c6/7f17e5707313600efcb85e9a3fedea35dba591 +0 -0
  153. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/c6/f32aced880bd165a251cb52b26b0c1107e2141 +0 -0
  154. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/cd/822b3574a88ebdd1ed82fd6983f37e626d52b4 +0 -0
  155. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/cf/0c0d9c6fb09473aaeb7f7e2edbd770c3f2ef3d +0 -0
  156. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d2/992df305f4b56a466a2f221aeb182ddd20f418 +0 -0
  157. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d6/9ab1c4aadf279936dd778e8346ba60f74705b6 +0 -0
  158. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d8/4688b54c0040a30976b3a6540bc47adf7ce680 +0 -0
  159. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d9/005f2cc7fc4e65f14ed5518276007c08cf2fd0 +0 -0
  160. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d9/c2403fd166ce791b4e9d0c6792ed8342c71fcd +0 -0
  161. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/d9/dfa5aee51e92a541b707e8e7baea6f06deff98 +0 -0
  162. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/db/141dbaa93594df2a8156182f361ee4db829359 +0 -0
  163. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/db/ffa8ea7bda721d0cee7b9e4ce5b2ef927733ff +0 -0
  164. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/dc/c2bdbafb3296e09d9ee4955cfa55d275825f94 +0 -0
  165. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/dc/cdbd4266765d840be2ae35ab1752a0fa312c16 +0 -0
  166. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/dd/87fb5f606fe380d81e6fe3a2c98f9f99e3e09b +0 -0
  167. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/df/e0770424b2a19faf507a501ebfc23be8f54e7b +0 -0
  168. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/e2/f2f8f4c25e62a297fc55f36acc6b01cfbab76f +0 -0
  169. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/e3/1356f90ea6dd0577b5e0b40b206319adcbf085 +0 -0
  170. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/e3/5a4dafc50850cacac7bf76c56db2715cbda2c4 +0 -0
  171. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/e9/391ffe371f1cc43b42ef09b705d9c767c2e14f +0 -0
  172. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/ea/3a18cc75e53792744ef754e05d3f4481768c13 +0 -0
  173. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/ec/40fd8bf8e4c342534a9fc020289e402ba6bc9d +0 -0
  174. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f1/e50757fddc28b445545dc7e2759b54cdd0f42e +0 -0
  175. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f4/b64d3107b39e3ad6f540c6607004ea34e6c024 +0 -0
  176. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f4/ba7f815b886797b73fede071d86e0c134d2bc7 +0 -0
  177. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f6/44a8ff56fa035105fc517cbb1ac46c3d8e349a +0 -0
  178. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f7/c98ba5c2f903e603b1f5e63d49fbc8a43815cc +0 -0
  179. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/f9/045a08e96eb76848fc4d68e3e3e687cca39a2d +0 -0
  180. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/fa/147e6bb78a2e8db241d231295fd7f1ed061af8 +0 -0
  181. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/objects/fc/292e793ecfd42240ac43be407023bd731fa9e7 +0 -0
  182. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.git/refs/remotes/origin/HEAD +0 -0
  183. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.gitattributes +0 -0
  184. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/.gitignore +0 -0
  185. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/LICENSE +0 -0
  186. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/README.md +0 -0
  187. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/__init__.py +0 -0
  188. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/brain_atlas.py +0 -0
  189. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/chat.py +0 -0
  190. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/correlators.py +0 -0
  191. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/.DS_Store +0 -0
  192. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/db2ls_sql_chtsht.json +0 -0
  193. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/docs_links.json +0 -0
  194. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/lang_code_iso639.json +0 -0
  195. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style1.pdf +0 -0
  196. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style2.pdf +0 -0
  197. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style3.pdf +0 -0
  198. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style4.pdf +0 -0
  199. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style5.pdf +0 -0
  200. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style6.pdf +0 -0
  201. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style7.pdf +0 -0
  202. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style8.pdf +0 -0
  203. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/example/style9.pdf +0 -0
  204. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style1.json +0 -0
  205. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style10.json +0 -0
  206. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style11.json +0 -0
  207. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style12.json +0 -0
  208. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style2.json +0 -0
  209. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style3.json +0 -0
  210. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style4.json +0 -0
  211. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style5.json +0 -0
  212. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style6.json +0 -0
  213. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style7.json +0 -0
  214. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style8.json +0 -0
  215. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/data/styles/style9.json +0 -0
  216. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/db2ls.py +0 -0
  217. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/doc.py +0 -0
  218. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/export_requirements.py +0 -0
  219. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/freqanalysis.py +0 -0
  220. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/ich2ls.py +0 -0
  221. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/setuptools-70.1.0-py3-none-any.whl +0 -0
  222. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/sleep_events_detectors.py +0 -0
  223. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/stats.py +0 -0
  224. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/translator.py +0 -0
  225. {py2ls-0.1.10.0 → py2ls-0.1.10.1}/py2ls/wb_detector.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: py2ls
3
- Version: 0.1.10.0
3
+ Version: 0.1.10.1
4
4
  Summary: py(thon)2(too)ls
5
5
  Author: Jianfeng
6
6
  Author-email: Jianfeng.Liu0413@gmail.com
@@ -0,0 +1 @@
1
+ reg_update
@@ -0,0 +1 @@
1
+ 86e288b46f8fe179907e4413f665aeb5053fddb1 branch 'main' of https://github.com/Jianfengliu0413/py2ls
Binary file
@@ -19,3 +19,4 @@ d84688b54c0040a30976b3a6540bc47adf7ce680 32fd627b62fad7cf3b2f9e34ab9777126a0987a
19
19
  1c3f92adda34344bcbbbf9d409c79855ae2aaea8 bf67907e337021ebff434e02b19b30a741c144af Jianfeng <Jianfeng.Liu0413@gmail.com> 1720948339 +0200 commit: update
20
20
  bf67907e337021ebff434e02b19b30a741c144af a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng <Jianfeng.Liu0413@gmail.com> 1721137352 +0200 commit: update ips
21
21
  a15389729850729fc7bd78a54f26fce77f30be12 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng <Jianfeng.Liu0413@gmail.com> 1723527985 +0200 commit: update
22
+ 6dc2cdf4a84e538e5d4777486aeff87e42f41799 86e288b46f8fe179907e4413f665aeb5053fddb1 Jianfeng <Jianfeng.Liu0413@gmail.com> 1725537214 +0200 commit: reg_update
@@ -19,3 +19,4 @@ d84688b54c0040a30976b3a6540bc47adf7ce680 32fd627b62fad7cf3b2f9e34ab9777126a0987a
19
19
  1c3f92adda34344bcbbbf9d409c79855ae2aaea8 bf67907e337021ebff434e02b19b30a741c144af Jianfeng <Jianfeng.Liu0413@gmail.com> 1720948339 +0200 commit: update
20
20
  bf67907e337021ebff434e02b19b30a741c144af a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng <Jianfeng.Liu0413@gmail.com> 1721137352 +0200 commit: update ips
21
21
  a15389729850729fc7bd78a54f26fce77f30be12 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng <Jianfeng.Liu0413@gmail.com> 1723527985 +0200 commit: update
22
+ 6dc2cdf4a84e538e5d4777486aeff87e42f41799 86e288b46f8fe179907e4413f665aeb5053fddb1 Jianfeng <Jianfeng.Liu0413@gmail.com> 1725537214 +0200 commit: reg_update
@@ -137,3 +137,4 @@ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be1
137
137
  a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721326072 +0200 remote set-head
138
138
  a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@jflmbp.speedport.ip> 1723527981 +0200 remote set-head
139
139
  6dc2cdf4a84e538e5d4777486aeff87e42f41799 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng Liu <macjianfeng@jflmbp.speedport.ip> 1723527990 +0200 remote set-head
140
+ 86e288b46f8fe179907e4413f665aeb5053fddb1 86e288b46f8fe179907e4413f665aeb5053fddb1 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1725537218 +0200 remote set-head
@@ -18,3 +18,4 @@ d84688b54c0040a30976b3a6540bc47adf7ce680 32fd627b62fad7cf3b2f9e34ab9777126a0987a
18
18
  1c3f92adda34344bcbbbf9d409c79855ae2aaea8 bf67907e337021ebff434e02b19b30a741c144af Jianfeng <Jianfeng.Liu0413@gmail.com> 1720948342 +0200 update by push
19
19
  bf67907e337021ebff434e02b19b30a741c144af a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng <Jianfeng.Liu0413@gmail.com> 1721137354 +0200 update by push
20
20
  a15389729850729fc7bd78a54f26fce77f30be12 6dc2cdf4a84e538e5d4777486aeff87e42f41799 Jianfeng <Jianfeng.Liu0413@gmail.com> 1723527989 +0200 update by push
21
+ 6dc2cdf4a84e538e5d4777486aeff87e42f41799 86e288b46f8fe179907e4413f665aeb5053fddb1 Jianfeng <Jianfeng.Liu0413@gmail.com> 1725537218 +0200 update by push
@@ -0,0 +1 @@
1
+ 86e288b46f8fe179907e4413f665aeb5053fddb1
@@ -0,0 +1 @@
1
+ 86e288b46f8fe179907e4413f665aeb5053fddb1
@@ -7,20 +7,19 @@ import schedule
7
7
  import time
8
8
  from datetime import datetime
9
9
  import os
10
+ from pprint import pp
11
+ import json
10
12
 
11
13
 
12
- signature_styles = [
13
- "", # none
14
- (
15
- "------------------------------------------------------------------------------------------------\n"
16
- "Jianfeng Liu, PhD\n"
17
- "Institute of Medical Psychology and Behavioural Neurobiology\n"
18
- "University of Tübingen\n"
19
- "Otfried-Müller-Str. 25\n"
20
- "72076 Tübingen\n\n"
21
- ),
22
- f"Pappelweg 8\n72076 Tübingen\n\n",
23
- ]
14
+ def extract_kv(
15
+ dir_data="/Users/macjianfeng/Dropbox/github/python/py2ls/confidential_data/gmail_login.json",
16
+ idx=0,
17
+ ): # select the index
18
+ with open(dir_data, "r") as file:
19
+ email_login = json.load(file)
20
+ for i, (user, pd) in enumerate(email_login.items()):
21
+ if i == idx:
22
+ return user, pd
24
23
 
25
24
 
26
25
  def email_to(**kwargs):
@@ -40,7 +39,10 @@ def email_to(**kwargs):
40
39
  who, what, subject = None, None, None
41
40
  attachments = False
42
41
  pause_sec = False # default 10 seconds pause
43
- signature = signature_styles[0]
42
+
43
+ signature_styles = extract_kv(idx=1)[1] # signature list
44
+ signature = signature_styles[0] # default signature,None
45
+ verbose = True
44
46
 
45
47
  # params config
46
48
  for k, v in kwargs.items():
@@ -67,15 +69,14 @@ def email_to(**kwargs):
67
69
  if any(["sig" in k.lower()]): # 'attachments', 'file'
68
70
  signature = v # optional
69
71
  if not isinstance(v, str):
72
+ print(signature_styles)
70
73
  signature = signature_styles[v]
71
-
72
- # config sender
73
- email_address = "andyandhope@gmail.com"
74
- email_password = "myff ltls sfym wehe" # this is fake info
74
+ if any(["verb" in k.lower(), "show" in k.lower()]): # 'verbose', 'show'
75
+ verbose = v # verbose
75
76
 
76
77
  # Create email message
77
78
  message = MIMEMultipart()
78
- message["From"] = email_address
79
+ message["From"] = extract_kv()[0]
79
80
  message["To"] = who
80
81
  message["Subject"] = subject
81
82
 
@@ -97,10 +98,9 @@ def email_to(**kwargs):
97
98
  part.set_payload(attachment.read())
98
99
  encoders.encode_base64(part)
99
100
 
100
- fname = os.path.basename(file)
101
- print(fname)
102
101
  part.add_header(
103
- "Content-Disposition", f'attachment; filename= "{fname}"'
102
+ "Content-Disposition",
103
+ f'attachment; filename= "{os.path.basename(file)}"',
104
104
  )
105
105
  message.attach(part)
106
106
  except FileNotFoundError:
@@ -109,13 +109,21 @@ def email_to(**kwargs):
109
109
  print(f"Error attaching file {file}: {e}")
110
110
  if pause_sec:
111
111
  time.sleep(pause_sec)
112
+
112
113
  # Send the email
113
114
  try:
114
115
  with smtplib.SMTP("smtp.gmail.com", 587) as server:
115
116
  server.starttls()
116
- server.login(email_address, email_password)
117
- server.sendmail(email_address, who, message.as_string())
118
- print(f"Email successfully sent to {who}")
117
+ server.login(extract_kv()[0], extract_kv()[1])
118
+ server.sendmail(extract_kv()[0], who, message.as_string())
119
+ if verbose:
120
+ if attachments:
121
+ print(
122
+ f'\nEmail successfully sent to:\nto:"{who}"\nsubject:{subject}\nattached:'
123
+ )
124
+ pp(attachments)
125
+ else:
126
+ print(f'\nEmail successfully sent to:\nto:"{who}"\nsubject:{subject}')
119
127
  except Exception as e:
120
128
  print(f"Failed to send email: {e}")
121
129
 
@@ -158,26 +166,33 @@ def example_job():
158
166
 
159
167
 
160
168
  if __name__ == "__main__":
161
- # Schedule the job to run every minute
162
- schedule.every(1).minutes.do(example_job)
163
-
164
- while True:
165
- schedule.run_pending()
166
- time.sleep(1)
167
-
168
- # example2:
169
- email_to(
170
- who="Jianfeng.Liu@medizin.uni-tuebingen.de",
171
- subj="test",
172
- wha="this is the body",
173
- signat="\n\n Best, Jianfeng\n",
174
- att="/Users/macjianfeng/Dropbox/Downloads/_*_doc-xlsx/20240822-preprints_full_20190101_20201031-2.xlsx",
175
- )
176
- # example3:
177
- email_to(
178
- who="Jianfeng.Liu@medizin.uni-tuebingen.de",
179
- subj="test",
180
- wha="this is the test",
181
- signat=2,
182
- att="/Users/macjianfeng/Dropbox/Downloads/_*_doc-xlsx/20240822-preprints_full_20190101_20201031-2.xlsx",
183
- )
169
+ pass
170
+ # # Schedule the job to run every minute
171
+ # schedule.every(1).minutes.do(example_job)
172
+
173
+ # while True:
174
+ # schedule.run_pending()
175
+ # time.sleep(1)
176
+
177
+ # # example2:
178
+ # email_to(
179
+ # who="Jianfeng.Liu@medizin.uni-tuebingen.de",
180
+ # subj="test",
181
+ # wha="this is the body",
182
+ # signat="\n\n Best, Jianfeng\n",
183
+ # att="/Users/macjianfeng/Dropbox/Downloads/_*_doc-xlsx/20240822-preprints_full_20190101_20201031-2.xlsx",
184
+ # )
185
+
186
+ # # example3:
187
+ # email_to(
188
+ # who="Jianfeng.Liu@medizin.uni-tuebingen.de",
189
+ # subj="test",
190
+ # wha="this is the test",
191
+ # signat=2,
192
+ # # att="/Users/macjianfeng/Dropbox/Downloads/_*_doc-xlsx/20240822-preprints_full_20190101_20201031-2.xlsx",
193
+ # )
194
+
195
+ # # example_4
196
+ # print(extract_kv(idx=0))
197
+ # print(extract_kv(idx=0)[0])
198
+ # print(extract_kv(idx=1))
@@ -295,7 +295,7 @@ def is_text(s):
295
295
  return has_alpha and has_non_alpha
296
296
 
297
297
 
298
- def strcmp(search_term, candidates, ignore_case=True, verbose=True, scorer="WR"):
298
+ def strcmp(search_term, candidates, ignore_case=True, verbose=False, scorer="WR"):
299
299
  """
300
300
  Compares a search term with a list of candidate strings and finds the best match based on similarity score.
301
301
 
@@ -63,6 +63,36 @@ def user_agent(
63
63
  return output_ua
64
64
 
65
65
 
66
+ def get_tags(content, ascending=True):
67
+ tag_names = set()
68
+
69
+ # Iterate through all tags in the parsed HTML
70
+ for tag in content.find_all(True): # `True` finds all tags
71
+ tag_names.add(tag.name) # Add the tag name to the set
72
+
73
+ # Convert set to a sorted list for easier reading (optional)
74
+ if ascending is None:
75
+ return tag_names
76
+ else:
77
+ if ascending:
78
+ return sorted(tag_names)
79
+ else:
80
+ return tag_names
81
+
82
+
83
+ def get_attr(content, where, attr):
84
+ all_tags = get_tags(content)
85
+ if all([where, attr]):
86
+ if where in all_tags:
87
+ element_ = content.find_all(where)
88
+ return [i[attr] for i in element_]
89
+ else:
90
+ print(
91
+ f"cannot find attr {attr} in tag_name{where}\n or possibly cannot find the tag_names:"
92
+ )
93
+ pp(all_tags)
94
+
95
+
66
96
  def extract_text_from_content(
67
97
  content, content_type="text/html", where=None, what=None, extend=True, **kwargs
68
98
  ):
@@ -128,7 +158,9 @@ def extract_text_from_content(
128
158
  result_set = content.find_all(where, **search_kwargs)
129
159
  else:
130
160
  result_set = content.find_all(where, attrs=dict(**search_kwargs))
131
-
161
+ if "get" in kwargs:
162
+ attr = kwargs["get"]
163
+ return get_attr(content, where, attr)
132
164
  if not result_set:
133
165
  print("Failed: check the 'attrs' setting: attrs={'id':'xample'}")
134
166
  if extend:
@@ -216,6 +248,60 @@ def get_cookies(url, login={"username": "your_username", "password": "your_passw
216
248
  return cookies_dict
217
249
 
218
250
 
251
+ ### 更加平滑地移动鼠标, 这样更容易反爬
252
+ def scroll_smth_steps(driver, scroll_pause=0.5, min_step=200, max_step=600):
253
+ """Smoothly scrolls down the page to trigger lazy loading."""
254
+ current_scroll_position = 0
255
+ end_of_page = driver.execute_script("return document.body.scrollHeight")
256
+
257
+ while current_scroll_position < end_of_page:
258
+ step = random.randint(min_step, max_step)
259
+ driver.execute_script(f"window.scrollBy(0, {step});")
260
+ time.sleep(scroll_pause)
261
+
262
+ # Update the current scroll position
263
+ current_scroll_position += step
264
+ end_of_page = driver.execute_script("return document.body.scrollHeight")
265
+
266
+
267
+ def scroll_inf2end(driver, scroll_pause=1):
268
+ """Continuously scrolls until the end of the page is reached."""
269
+ last_height = driver.execute_script("return document.body.scrollHeight")
270
+
271
+ while True:
272
+ # Scroll to the bottom
273
+ driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
274
+ time.sleep(scroll_pause)
275
+
276
+ # Get the new height after scrolling
277
+ new_height = driver.execute_script("return document.body.scrollHeight")
278
+ if new_height == last_height:
279
+ break # Exit if no new content is loaded
280
+ last_height = new_height
281
+
282
+
283
+ def corr_by_kind(wait_until_kind):
284
+ """
285
+ Map the 'wait_until_kind' string to the appropriate Selenium By strategy.
286
+ """
287
+ if "tag" in wait_until_kind:
288
+ return By.TAG_NAME
289
+ elif "css" in wait_until_kind:
290
+ return By.CSS_SELECTOR
291
+ elif "id" in wait_until_kind:
292
+ return By.ID
293
+ elif "name" in wait_until_kind:
294
+ return By.NAME
295
+ elif "class" in wait_until_kind:
296
+ return By.CLASS_NAME
297
+ elif "path" in wait_until_kind:
298
+ return By.XPATH
299
+ elif "link" in wait_until_kind or "text" in wait_until_kind:
300
+ return By.LINK_TEXT
301
+ else:
302
+ raise ValueError(f"Unsupported wait_until_kind: {wait_until_kind}")
303
+
304
+
219
305
  def fetch_all(
220
306
  url,
221
307
  parser="lxml",
@@ -224,6 +310,8 @@ def fetch_all(
224
310
  timeout=10,
225
311
  retry=2,
226
312
  wait=0,
313
+ wait_until=None,
314
+ wait_until_kind=None,
227
315
  scroll_try=3,
228
316
  login_url=None,
229
317
  username=None,
@@ -308,7 +396,10 @@ def fetch_all(
308
396
  prefs = {"profile.managed_default_content_settings.images": 2}
309
397
  chrome_options.add_experimental_option("prefs", prefs)
310
398
  # chrome_options.page_load_strategy = capability
399
+
311
400
  service = Service(ChromeDriverManager().install())
401
+ # driver_path='/Users/macjianfeng/.wdm/drivers/chromedriver/mac64/127.0.6533.119/chromedriver-mac-arm64/chromedriver'
402
+ # service=Service(executable_path=driver_path)
312
403
 
313
404
  driver_ = webdriver.Chrome(service=service, options=chrome_options)
314
405
 
@@ -323,6 +414,11 @@ def fetch_all(
323
414
  wait_ = 0
324
415
  driver_.implicitly_wait(wait_)
325
416
 
417
+ if wait_until is not None and wait_until_kind is not None:
418
+ strategy = corr_by_kind(wait_until_kind)
419
+ WebDriverWait(driver_, timeout).until(
420
+ EC.presence_of_element_located((strategy, wait_until))
421
+ )
326
422
  if login_url and login_dict:
327
423
  cookies = get_cookies(url=login_url, login=login_dict)
328
424
  driver_.get(url)
@@ -358,6 +454,9 @@ def fetch_all(
358
454
  # EC.presence_of_element_located((by, where))
359
455
  # )
360
456
 
457
+ # # scroll down the page by a certain number of pixels
458
+ scroll_smth_steps(driver_)
459
+
361
460
  # 设置轮询
362
461
  for attempt in range(scroll_try):
363
462
  page_source = driver_.page_source