scrapegraphai 0.2.0__tar.gz → 0.2.2__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.
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/PKG-INFO +15 -15
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/README.md +13 -13
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/pyproject.toml +2 -2
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/graphs/abstract_graph.py +2 -2
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/graphs/script_creator_graph.py +4 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/nodes/__init__.py +2 -2
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/nodes/fetch_node.py +4 -3
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/nodes/generate_scraper_node.py +22 -12
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/utils/remover.py +2 -11
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/LICENSE +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/__init__.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/builders/__init__.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/builders/graph_builder.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/graphs/__init__.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/graphs/base_graph.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/graphs/search_graph.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/graphs/smart_scraper_graph.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/graphs/speech_graph.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/helpers/__init__.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/helpers/models_tokens.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/helpers/nodes_metadata.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/helpers/schemas.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/models/__init__.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/models/azure_openai.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/models/gemini.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/models/hugging_face.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/models/ollama.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/models/openai.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/models/openai_itt.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/models/openai_tts.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/nodes/base_node.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/nodes/conditional_node.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/nodes/generate_answer_node.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/nodes/get_probable_tags_node.py +0 -0
- /scrapegraphai-0.2.0/scrapegraphai/nodes/image_to_text_node.py → /scrapegraphai-0.2.2/scrapegraphai/nodes/image_to_text_node_openai.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/nodes/parse_node.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/nodes/rag_node.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/nodes/search_internet_node.py +0 -0
- /scrapegraphai-0.2.0/scrapegraphai/nodes/text_to_speech_node.py → /scrapegraphai-0.2.2/scrapegraphai/nodes/text_to_speech_node_openai.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/utils/__init__.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/utils/convert_to_csv.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/utils/convert_to_json.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/utils/parse_state_keys.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/utils/prettify_exec_info.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/utils/research_web.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/utils/save_audio_from_bytes.py +0 -0
- {scrapegraphai-0.2.0 → scrapegraphai-0.2.2}/scrapegraphai/utils/token_calculator.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: scrapegraphai
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: A web scraping library based on LangChain which uses LLM and direct graph logic to create scraping pipelines.
|
|
5
5
|
Home-page: https://scrapegraph-ai.readthedocs.io/
|
|
6
6
|
License: MIT
|
|
@@ -17,7 +17,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
18
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
19
19
|
Requires-Dist: beautifulsoup4 (==4.12.3)
|
|
20
|
-
Requires-Dist: faiss-cpu (==1.
|
|
20
|
+
Requires-Dist: faiss-cpu (==1.8.0)
|
|
21
21
|
Requires-Dist: google (==3.0.0)
|
|
22
22
|
Requires-Dist: graphviz (==0.20.1)
|
|
23
23
|
Requires-Dist: html2text (==2020.1.16)
|
|
@@ -42,7 +42,7 @@ Description-Content-Type: text/markdown
|
|
|
42
42
|
[](https://discord.gg/gkxQDAjfeX)
|
|
43
43
|
|
|
44
44
|
|
|
45
|
-
ScrapeGraphAI is a *web scraping* python library
|
|
45
|
+
ScrapeGraphAI is a *web scraping* python library that uses LLM and direct graph logic to create scraping pipelines for websites, documents and XML files.
|
|
46
46
|
Just say which information you want to extract and the library will do it for you!
|
|
47
47
|
|
|
48
48
|
<p align="center">
|
|
@@ -52,7 +52,7 @@ Just say which information you want to extract and the library will do it for yo
|
|
|
52
52
|
|
|
53
53
|
## 🚀 Quick install
|
|
54
54
|
|
|
55
|
-
The reference page for Scrapegraph-ai is
|
|
55
|
+
The reference page for Scrapegraph-ai is available on the official page of pypy: [pypi](https://pypi.org/project/scrapegraphai/).
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
58
|
pip install scrapegraphai
|
|
@@ -78,7 +78,7 @@ Check out also the docusaurus [documentation](https://scrapegraph-doc.onrender.c
|
|
|
78
78
|
You can use the `SmartScraper` class to extract information from a website using a prompt.
|
|
79
79
|
|
|
80
80
|
The `SmartScraper` class is a direct graph implementation that uses the most common nodes present in a web scraping pipeline. For more information, please see the [documentation](https://scrapegraph-ai.readthedocs.io/en/latest/).
|
|
81
|
-
### Case 1: Extracting
|
|
81
|
+
### Case 1: Extracting information using Ollama
|
|
82
82
|
Remember to download the model on Ollama separately!
|
|
83
83
|
```python
|
|
84
84
|
from scrapegraphai.graphs import SmartScraperGraph
|
|
@@ -88,12 +88,12 @@ graph_config = {
|
|
|
88
88
|
"model": "ollama/mistral",
|
|
89
89
|
"temperature": 0,
|
|
90
90
|
"format": "json", # Ollama needs the format to be specified explicitly
|
|
91
|
-
"base_url": "http://localhost:11434", # set
|
|
91
|
+
"base_url": "http://localhost:11434", # set Ollama URL arbitrarily
|
|
92
92
|
},
|
|
93
93
|
"embeddings": {
|
|
94
94
|
"model": "ollama/nomic-embed-text",
|
|
95
95
|
"temperature": 0,
|
|
96
|
-
"base_url": "http://localhost:11434", # set
|
|
96
|
+
"base_url": "http://localhost:11434", # set Ollama URL arbitrarily
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
@@ -109,9 +109,9 @@ print(result)
|
|
|
109
109
|
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
-
### Case 2: Extracting
|
|
112
|
+
### Case 2: Extracting information using Docker
|
|
113
113
|
|
|
114
|
-
Note: before using the local model
|
|
114
|
+
Note: before using the local model remember to create the docker container!
|
|
115
115
|
```text
|
|
116
116
|
docker-compose up -d
|
|
117
117
|
docker exec -it ollama ollama run stablelm-zephyr
|
|
@@ -141,7 +141,7 @@ print(result)
|
|
|
141
141
|
```
|
|
142
142
|
|
|
143
143
|
|
|
144
|
-
### Case 3: Extracting
|
|
144
|
+
### Case 3: Extracting information using Openai model
|
|
145
145
|
```python
|
|
146
146
|
from scrapegraphai.graphs import SmartScraperGraph
|
|
147
147
|
OPENAI_API_KEY = "YOUR_API_KEY"
|
|
@@ -164,7 +164,7 @@ result = smart_scraper_graph.run()
|
|
|
164
164
|
print(result)
|
|
165
165
|
```
|
|
166
166
|
|
|
167
|
-
### Case 4: Extracting
|
|
167
|
+
### Case 4: Extracting information using Gemini
|
|
168
168
|
```python
|
|
169
169
|
from scrapegraphai.graphs import SmartScraperGraph
|
|
170
170
|
GOOGLE_APIKEY = "YOUR_API_KEY"
|
|
@@ -188,7 +188,7 @@ result = smart_scraper_graph.run()
|
|
|
188
188
|
print(result)
|
|
189
189
|
```
|
|
190
190
|
|
|
191
|
-
The output for
|
|
191
|
+
The output for all 3 the cases will be a dictionary with the extracted information, for example:
|
|
192
192
|
|
|
193
193
|
```bash
|
|
194
194
|
{
|
|
@@ -203,9 +203,9 @@ The output for alle 3 the cases will be a dictionary with the extracted informat
|
|
|
203
203
|
|
|
204
204
|
## 🤝 Contributing
|
|
205
205
|
|
|
206
|
-
|
|
206
|
+
Feel free to contribute and join our Discord server to discuss with us improvements and give us suggestions!
|
|
207
207
|
|
|
208
|
-
|
|
208
|
+
Please see the [contributing guidelines](https://github.com/VinciGit00/Scrapegraph-ai/blob/main/CONTRIBUTING.md).
|
|
209
209
|
|
|
210
210
|
[](https://discord.gg/gkxQDAjfeX)
|
|
211
211
|
[](https://www.linkedin.com/company/scrapegraphai/)
|
|
@@ -222,7 +222,7 @@ If you have used our library for research purposes please quote us with the foll
|
|
|
222
222
|
title = {Scrapegraph-ai},
|
|
223
223
|
year = {2024},
|
|
224
224
|
url = {https://github.com/VinciGit00/Scrapegraph-ai},
|
|
225
|
-
note = {A Python library for scraping
|
|
225
|
+
note = {A Python library for scraping leveraging large language models}
|
|
226
226
|
}
|
|
227
227
|
```
|
|
228
228
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://discord.gg/gkxQDAjfeX)
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
ScrapeGraphAI is a *web scraping* python library
|
|
10
|
+
ScrapeGraphAI is a *web scraping* python library that uses LLM and direct graph logic to create scraping pipelines for websites, documents and XML files.
|
|
11
11
|
Just say which information you want to extract and the library will do it for you!
|
|
12
12
|
|
|
13
13
|
<p align="center">
|
|
@@ -17,7 +17,7 @@ Just say which information you want to extract and the library will do it for yo
|
|
|
17
17
|
|
|
18
18
|
## 🚀 Quick install
|
|
19
19
|
|
|
20
|
-
The reference page for Scrapegraph-ai is
|
|
20
|
+
The reference page for Scrapegraph-ai is available on the official page of pypy: [pypi](https://pypi.org/project/scrapegraphai/).
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
23
|
pip install scrapegraphai
|
|
@@ -43,7 +43,7 @@ Check out also the docusaurus [documentation](https://scrapegraph-doc.onrender.c
|
|
|
43
43
|
You can use the `SmartScraper` class to extract information from a website using a prompt.
|
|
44
44
|
|
|
45
45
|
The `SmartScraper` class is a direct graph implementation that uses the most common nodes present in a web scraping pipeline. For more information, please see the [documentation](https://scrapegraph-ai.readthedocs.io/en/latest/).
|
|
46
|
-
### Case 1: Extracting
|
|
46
|
+
### Case 1: Extracting information using Ollama
|
|
47
47
|
Remember to download the model on Ollama separately!
|
|
48
48
|
```python
|
|
49
49
|
from scrapegraphai.graphs import SmartScraperGraph
|
|
@@ -53,12 +53,12 @@ graph_config = {
|
|
|
53
53
|
"model": "ollama/mistral",
|
|
54
54
|
"temperature": 0,
|
|
55
55
|
"format": "json", # Ollama needs the format to be specified explicitly
|
|
56
|
-
"base_url": "http://localhost:11434", # set
|
|
56
|
+
"base_url": "http://localhost:11434", # set Ollama URL arbitrarily
|
|
57
57
|
},
|
|
58
58
|
"embeddings": {
|
|
59
59
|
"model": "ollama/nomic-embed-text",
|
|
60
60
|
"temperature": 0,
|
|
61
|
-
"base_url": "http://localhost:11434", # set
|
|
61
|
+
"base_url": "http://localhost:11434", # set Ollama URL arbitrarily
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
|
|
@@ -74,9 +74,9 @@ print(result)
|
|
|
74
74
|
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
### Case 2: Extracting
|
|
77
|
+
### Case 2: Extracting information using Docker
|
|
78
78
|
|
|
79
|
-
Note: before using the local model
|
|
79
|
+
Note: before using the local model remember to create the docker container!
|
|
80
80
|
```text
|
|
81
81
|
docker-compose up -d
|
|
82
82
|
docker exec -it ollama ollama run stablelm-zephyr
|
|
@@ -106,7 +106,7 @@ print(result)
|
|
|
106
106
|
```
|
|
107
107
|
|
|
108
108
|
|
|
109
|
-
### Case 3: Extracting
|
|
109
|
+
### Case 3: Extracting information using Openai model
|
|
110
110
|
```python
|
|
111
111
|
from scrapegraphai.graphs import SmartScraperGraph
|
|
112
112
|
OPENAI_API_KEY = "YOUR_API_KEY"
|
|
@@ -129,7 +129,7 @@ result = smart_scraper_graph.run()
|
|
|
129
129
|
print(result)
|
|
130
130
|
```
|
|
131
131
|
|
|
132
|
-
### Case 4: Extracting
|
|
132
|
+
### Case 4: Extracting information using Gemini
|
|
133
133
|
```python
|
|
134
134
|
from scrapegraphai.graphs import SmartScraperGraph
|
|
135
135
|
GOOGLE_APIKEY = "YOUR_API_KEY"
|
|
@@ -153,7 +153,7 @@ result = smart_scraper_graph.run()
|
|
|
153
153
|
print(result)
|
|
154
154
|
```
|
|
155
155
|
|
|
156
|
-
The output for
|
|
156
|
+
The output for all 3 the cases will be a dictionary with the extracted information, for example:
|
|
157
157
|
|
|
158
158
|
```bash
|
|
159
159
|
{
|
|
@@ -168,9 +168,9 @@ The output for alle 3 the cases will be a dictionary with the extracted informat
|
|
|
168
168
|
|
|
169
169
|
## 🤝 Contributing
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
Feel free to contribute and join our Discord server to discuss with us improvements and give us suggestions!
|
|
172
172
|
|
|
173
|
-
|
|
173
|
+
Please see the [contributing guidelines](https://github.com/VinciGit00/Scrapegraph-ai/blob/main/CONTRIBUTING.md).
|
|
174
174
|
|
|
175
175
|
[](https://discord.gg/gkxQDAjfeX)
|
|
176
176
|
[](https://www.linkedin.com/company/scrapegraphai/)
|
|
@@ -187,7 +187,7 @@ If you have used our library for research purposes please quote us with the foll
|
|
|
187
187
|
title = {Scrapegraph-ai},
|
|
188
188
|
year = {2024},
|
|
189
189
|
url = {https://github.com/VinciGit00/Scrapegraph-ai},
|
|
190
|
-
note = {A Python library for scraping
|
|
190
|
+
note = {A Python library for scraping leveraging large language models}
|
|
191
191
|
}
|
|
192
192
|
```
|
|
193
193
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "scrapegraphai"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.2"
|
|
4
4
|
description = "A web scraping library based on LangChain which uses LLM and direct graph logic to create scraping pipelines."
|
|
5
5
|
authors = [
|
|
6
6
|
"Marco Vinciguerra <mvincig11@gmail.com>",
|
|
@@ -26,7 +26,7 @@ langchain = "0.1.14"
|
|
|
26
26
|
langchain-openai = "0.1.1"
|
|
27
27
|
langchain-google-genai = "1.0.1"
|
|
28
28
|
html2text = "2020.1.16"
|
|
29
|
-
faiss-cpu = "1.
|
|
29
|
+
faiss-cpu = "1.8.0"
|
|
30
30
|
beautifulsoup4 = "4.12.3"
|
|
31
31
|
pandas = "2.0.3"
|
|
32
32
|
python-dotenv = "1.0.1"
|
|
@@ -6,6 +6,7 @@ from typing import Optional
|
|
|
6
6
|
from ..models import OpenAI, Gemini, Ollama, AzureOpenAI, HuggingFace
|
|
7
7
|
from ..helpers import models_tokens
|
|
8
8
|
|
|
9
|
+
|
|
9
10
|
class AbstractGraph(ABC):
|
|
10
11
|
"""
|
|
11
12
|
Abstract class representing a generic graph-based tool.
|
|
@@ -22,7 +23,6 @@ class AbstractGraph(ABC):
|
|
|
22
23
|
self.embedder_model = None if "embeddings" not in config else self._create_llm(
|
|
23
24
|
config["embeddings"])
|
|
24
25
|
self.graph = self._create_graph()
|
|
25
|
-
|
|
26
26
|
self.final_state = None
|
|
27
27
|
self.execution_info = None
|
|
28
28
|
|
|
@@ -88,7 +88,7 @@ class AbstractGraph(ABC):
|
|
|
88
88
|
Returns the execution information of the graph.
|
|
89
89
|
"""
|
|
90
90
|
return self.execution_info
|
|
91
|
-
|
|
91
|
+
|
|
92
92
|
@abstractmethod
|
|
93
93
|
def _create_graph(self):
|
|
94
94
|
"""
|
|
@@ -21,6 +21,8 @@ class ScriptCreatorGraph(AbstractGraph):
|
|
|
21
21
|
"""
|
|
22
22
|
Initializes the ScriptCreatorGraph with a prompt, source, and configuration.
|
|
23
23
|
"""
|
|
24
|
+
self.library = config['library']
|
|
25
|
+
|
|
24
26
|
super().__init__(prompt, config, source)
|
|
25
27
|
|
|
26
28
|
self.input_key = "url" if source.startswith("http") else "local_dir"
|
|
@@ -50,6 +52,8 @@ class ScriptCreatorGraph(AbstractGraph):
|
|
|
50
52
|
input="user_prompt & (relevant_chunks | parsed_doc | doc)",
|
|
51
53
|
output=["answer"],
|
|
52
54
|
node_config={"llm": self.llm_model},
|
|
55
|
+
library=self.library,
|
|
56
|
+
website=self.source
|
|
53
57
|
)
|
|
54
58
|
|
|
55
59
|
return BaseGraph(
|
|
@@ -8,7 +8,7 @@ from .get_probable_tags_node import GetProbableTagsNode
|
|
|
8
8
|
from .generate_answer_node import GenerateAnswerNode
|
|
9
9
|
from .parse_node import ParseNode
|
|
10
10
|
from .rag_node import RAGNode
|
|
11
|
-
from .
|
|
12
|
-
from .
|
|
11
|
+
from .text_to_speech_node_openai import TextToSpeechNode
|
|
12
|
+
from .image_to_text_node_openai import ImageToTextNode
|
|
13
13
|
from .search_internet_node import SearchInternetNode
|
|
14
14
|
from .generate_scraper_node import GenerateScraperNode
|
|
@@ -72,7 +72,7 @@ class FetchNode(BaseNode):
|
|
|
72
72
|
|
|
73
73
|
# if it is a local directory
|
|
74
74
|
if not source.startswith("http"):
|
|
75
|
-
|
|
75
|
+
compressed_document = [Document(page_content=remover(source), metadata={
|
|
76
76
|
"source": "local_dir"
|
|
77
77
|
})]
|
|
78
78
|
|
|
@@ -80,7 +80,8 @@ class FetchNode(BaseNode):
|
|
|
80
80
|
else:
|
|
81
81
|
loader = AsyncHtmlLoader(source)
|
|
82
82
|
document = loader.load()
|
|
83
|
-
|
|
83
|
+
compressed_document = [
|
|
84
|
+
Document(page_content=remover(str(document)))]
|
|
84
85
|
|
|
85
|
-
state.update({self.output[0]:
|
|
86
|
+
state.update({self.output[0]: compressed_document})
|
|
86
87
|
return state
|
|
@@ -7,7 +7,7 @@ from tqdm import tqdm
|
|
|
7
7
|
|
|
8
8
|
# Imports from Langchain
|
|
9
9
|
from langchain.prompts import PromptTemplate
|
|
10
|
-
from langchain_core.output_parsers import
|
|
10
|
+
from langchain_core.output_parsers import StrOutputParser
|
|
11
11
|
from langchain_core.runnables import RunnableParallel
|
|
12
12
|
|
|
13
13
|
# Imports from the library
|
|
@@ -40,7 +40,7 @@ class GenerateScraperNode(BaseNode):
|
|
|
40
40
|
"""
|
|
41
41
|
|
|
42
42
|
def __init__(self, input: str, output: List[str], node_config: dict,
|
|
43
|
-
node_name: str = "GenerateAnswer"):
|
|
43
|
+
library: str, website: str, node_name: str = "GenerateAnswer"):
|
|
44
44
|
"""
|
|
45
45
|
Initializes the GenerateScraperNode with a language model client and a node name.
|
|
46
46
|
Args:
|
|
@@ -49,6 +49,8 @@ class GenerateScraperNode(BaseNode):
|
|
|
49
49
|
"""
|
|
50
50
|
super().__init__(node_name, "node", input, output, 2, node_config)
|
|
51
51
|
self.llm_model = node_config["llm"]
|
|
52
|
+
self.library = library
|
|
53
|
+
self.source = website
|
|
52
54
|
|
|
53
55
|
def execute(self, state):
|
|
54
56
|
"""
|
|
@@ -80,29 +82,36 @@ class GenerateScraperNode(BaseNode):
|
|
|
80
82
|
user_prompt = input_data[0]
|
|
81
83
|
doc = input_data[1]
|
|
82
84
|
|
|
83
|
-
output_parser =
|
|
84
|
-
format_instructions = output_parser.get_format_instructions()
|
|
85
|
+
output_parser = StrOutputParser()
|
|
85
86
|
|
|
86
87
|
template_chunks = """
|
|
87
88
|
PROMPT:
|
|
88
89
|
You are a website scraper script creator and you have just scraped the
|
|
89
90
|
following content from a website.
|
|
90
|
-
Write the code in python
|
|
91
|
+
Write the code in python for extracting the informations requested by the task.\n
|
|
92
|
+
The python library to use is specified in the instructions \n
|
|
91
93
|
The website is big so I am giving you one chunk at the time to be merged later with the other chunks.\n
|
|
92
94
|
CONTENT OF {chunk_id}: {context}.
|
|
93
95
|
Ignore all the context sentences that ask you not to extract information from the html code
|
|
94
|
-
|
|
96
|
+
The output should be just pyton code without any comment and should implement the main, the HTML code
|
|
97
|
+
should do a get to the website and use the library request for making the GET.
|
|
98
|
+
LIBRARY: {library}.
|
|
99
|
+
SOURCE: {source}
|
|
100
|
+
The output should be just pyton code without any comment and should implement the main.
|
|
95
101
|
QUESTION: {question}
|
|
96
102
|
"""
|
|
97
103
|
template_no_chunks = """
|
|
98
104
|
PROMPT:
|
|
99
105
|
You are a website scraper script creator and you have just scraped the
|
|
100
106
|
following content from a website.
|
|
101
|
-
Write the code in python
|
|
107
|
+
Write the code in python for extracting the informations requested by the task.\n
|
|
108
|
+
The python library to use is specified in the instructions \n
|
|
102
109
|
The website is big so I am giving you one chunk at the time to be merged later with the other chunks.\n
|
|
103
|
-
CONTENT OF {chunk_id}: {context}.
|
|
104
110
|
Ignore all the context sentences that ask you not to extract information from the html code
|
|
105
|
-
|
|
111
|
+
The output should be just pyton code without any comment and should implement the main, the HTML code
|
|
112
|
+
should do a get to the website and use the library request for making the GET.
|
|
113
|
+
LIBRARY: {library}
|
|
114
|
+
SOURCE: {source}
|
|
106
115
|
QUESTION: {question}
|
|
107
116
|
"""
|
|
108
117
|
|
|
@@ -130,8 +139,10 @@ class GenerateScraperNode(BaseNode):
|
|
|
130
139
|
template=template,
|
|
131
140
|
input_variables=["question"],
|
|
132
141
|
partial_variables={"context": chunk.page_content,
|
|
133
|
-
|
|
134
|
-
|
|
142
|
+
"chunk_id": i + 1,
|
|
143
|
+
"library": self.library,
|
|
144
|
+
"source": self.source
|
|
145
|
+
},
|
|
135
146
|
)
|
|
136
147
|
# Dynamically name the chains based on their index
|
|
137
148
|
chain_name = f"chunk{i+1}"
|
|
@@ -148,7 +159,6 @@ class GenerateScraperNode(BaseNode):
|
|
|
148
159
|
merge_prompt = PromptTemplate(
|
|
149
160
|
template=template_merge,
|
|
150
161
|
input_variables=["context", "question"],
|
|
151
|
-
partial_variables={"format_instructions": format_instructions},
|
|
152
162
|
)
|
|
153
163
|
merge_chain = merge_prompt | self.llm_model | output_parser
|
|
154
164
|
answer = merge_chain.invoke(
|
|
@@ -31,17 +31,8 @@ def remover(html_content: str) -> str:
|
|
|
31
31
|
# Body Extraction (if it exists)
|
|
32
32
|
body_content = soup.find('body')
|
|
33
33
|
if body_content:
|
|
34
|
-
# Remove some attributes from tags
|
|
35
|
-
""" tagsToRemove = ['style', 'rel', 'width',
|
|
36
|
-
'height', 'target', 'media',
|
|
37
|
-
'onerror', 'onload', 'onclick']
|
|
38
|
-
for tag in body_content.find_all():
|
|
39
|
-
for attr in tagsToRemove:
|
|
40
|
-
if tag.has_attr(attr):
|
|
41
|
-
del tag.attrs[attr] """
|
|
42
|
-
|
|
43
34
|
# Minify the HTML within the body tag
|
|
44
35
|
minimized_body = minify(str(body_content))
|
|
45
36
|
return "Title: " + title + ", Body: " + minimized_body
|
|
46
|
-
|
|
47
|
-
|
|
37
|
+
|
|
38
|
+
return "Title: " + title + ", Body: No body content found"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|