ilpost-api-wrapper 0.3.0__tar.gz → 0.4.0__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.
- {ilpost_api_wrapper-0.3.0/ilpost_api_wrapper.egg-info → ilpost_api_wrapper-0.4.0}/PKG-INFO +22 -2
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/README.md +196 -176
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/ilpost/__init__.py +16 -13
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/ilpost/cli.py +177 -164
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/ilpost/client.py +234 -219
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/ilpost/models.py +146 -145
- ilpost_api_wrapper-0.4.0/ilpost/scraper.py +94 -0
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0/ilpost_api_wrapper.egg-info}/PKG-INFO +22 -2
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/ilpost_api_wrapper.egg-info/SOURCES.txt +1 -0
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/pyproject.toml +40 -40
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/LICENSE +0 -0
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/ilpost/py.typed +0 -0
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/ilpost_api_wrapper.egg-info/dependency_links.txt +0 -0
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/ilpost_api_wrapper.egg-info/entry_points.txt +0 -0
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/ilpost_api_wrapper.egg-info/top_level.txt +0 -0
- {ilpost_api_wrapper-0.3.0 → ilpost_api_wrapper-0.4.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ilpost-api-wrapper
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: Python wrapper for Il Post newspaper API
|
|
5
5
|
Author: Antonio Girasella
|
|
6
6
|
License-Expression: MIT
|
|
@@ -72,6 +72,9 @@ for doc in result.docs:
|
|
|
72
72
|
| `content_type` | `ContentType` | `None` | Filter by content type |
|
|
73
73
|
| `category` | `str` | `None` | Editorial category (articles only) |
|
|
74
74
|
| `date_range` | `DateRange` | `None` | Publication date filter |
|
|
75
|
+
| `fetch_content` | `bool` | `False` | Scrape and return full article text for each article result (see [`Document.content`](#document)) |
|
|
76
|
+
|
|
77
|
+
> `fetch_content` is available on `search()`, `search_articles()`, and `paginate()`. It has no effect on podcast or newsletter results — `doc.content` will be `None` for those types.
|
|
75
78
|
|
|
76
79
|
#### Enums
|
|
77
80
|
|
|
@@ -127,6 +130,7 @@ for doc in result.docs:
|
|
|
127
130
|
| `category` | `str \| None` | Editorial category (articles only) |
|
|
128
131
|
| `post_tag_text` | `list[str]` | Tags (articles only) |
|
|
129
132
|
| `derived_info` | `dict` | Extra data: episode or newsletter metadata |
|
|
133
|
+
| `content` | `str \| None` | Full article body text, populated when `fetch_content=True` (articles only) |
|
|
130
134
|
| `is_article` | `bool` | Convenience property |
|
|
131
135
|
| `is_podcast` | `bool` | Convenience property |
|
|
132
136
|
| `is_newsletter` | `bool` | Convenience property |
|
|
@@ -162,6 +166,17 @@ for group in result.filters:
|
|
|
162
166
|
print(f"{group.label}:")
|
|
163
167
|
for opt in group.options:
|
|
164
168
|
print(f" {opt.label}: {opt.doc_count}")
|
|
169
|
+
|
|
170
|
+
# Fetch full article text alongside search results
|
|
171
|
+
result = client.search_articles("economia", hits=5, fetch_content=True)
|
|
172
|
+
for doc in result.docs:
|
|
173
|
+
print(doc.title)
|
|
174
|
+
if doc.content:
|
|
175
|
+
print(doc.content[:300])
|
|
176
|
+
|
|
177
|
+
# Use the scraper directly (e.g. for parallel fetching)
|
|
178
|
+
from ilpost import fetch_article_content
|
|
179
|
+
text = fetch_article_content("https://www.ilpost.it/2026/04/02/...")
|
|
165
180
|
```
|
|
166
181
|
|
|
167
182
|
## CLI
|
|
@@ -173,10 +188,12 @@ usage: ilpost-search [-h] [--type {articles,podcasts,newsletters}]
|
|
|
173
188
|
[--sort {relevance,newest,oldest}]
|
|
174
189
|
[--date {all,year,month}] [--category CATEGORY]
|
|
175
190
|
[--page PAGE] [--hits HITS] [--all-pages]
|
|
176
|
-
[--max-pages N]
|
|
191
|
+
[--max-pages N] [--fetch-content]
|
|
177
192
|
query
|
|
178
193
|
```
|
|
179
194
|
|
|
195
|
+
Each result is printed with labelled fields: `type`, `category`, `title`, `link`, `date`, `score`, `summary`, and either `content` (when `--fetch-content` is used) or `excerpt` (search highlight).
|
|
196
|
+
|
|
180
197
|
```bash
|
|
181
198
|
# Basic search
|
|
182
199
|
ilpost-search berlusconi
|
|
@@ -192,6 +209,9 @@ ilpost-search sicilia --sort oldest --hits 5 --page 2
|
|
|
192
209
|
|
|
193
210
|
# Fetch all pages of newsletter results (up to 3 pages)
|
|
194
211
|
ilpost-search economia --type newsletters --all-pages --max-pages 3
|
|
212
|
+
|
|
213
|
+
# Fetch full article text for each result
|
|
214
|
+
ilpost-search bondi --type articles --hits 3 --fetch-content
|
|
195
215
|
```
|
|
196
216
|
|
|
197
217
|
## Notes
|
|
@@ -1,176 +1,196 @@
|
|
|
1
|
-
# ilpost-api-wrapper
|
|
2
|
-
|
|
3
|
-
A Python wrapper for the [Il Post](https://www.ilpost.it) public search API.
|
|
4
|
-
Searches articles, podcast episodes, and newsletters — no authentication required.
|
|
5
|
-
|
|
6
|
-
## Installation
|
|
7
|
-
|
|
8
|
-
```bash
|
|
9
|
-
pip install ilpost-api-wrapper
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
Requires Python 3.9+. No third-party dependencies.
|
|
13
|
-
|
|
14
|
-
## Quick start
|
|
15
|
-
|
|
16
|
-
```python
|
|
17
|
-
from ilpost import IlPostClient, SortOrder, ContentType, DateRange
|
|
18
|
-
|
|
19
|
-
client = IlPostClient()
|
|
20
|
-
|
|
21
|
-
result = client.search("berlusconi")
|
|
22
|
-
for doc in result.docs:
|
|
23
|
-
print(doc.title, doc.link)
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## API reference
|
|
27
|
-
|
|
28
|
-
### `IlPostClient(timeout=10)`
|
|
29
|
-
|
|
30
|
-
| Method | Description |
|
|
31
|
-
|--------|-------------|
|
|
32
|
-
| `search(query, ...)` | General search across all content types |
|
|
33
|
-
| `search_articles(query, ...)` | Articles only |
|
|
34
|
-
| `search_podcasts(query, ...)` | Podcast episodes only |
|
|
35
|
-
| `search_newsletters(query, ...)` | Newsletter issues only |
|
|
36
|
-
| `paginate(query, ...)` | Generator that yields one `SearchResult` per page |
|
|
37
|
-
|
|
38
|
-
#### Common parameters
|
|
39
|
-
|
|
40
|
-
| Parameter | Type | Default | Description |
|
|
41
|
-
|-----------|------|---------|-------------|
|
|
42
|
-
| `query` | `str` | — | Search term |
|
|
43
|
-
| `page` | `int` | `1` | Page number (1-based) |
|
|
44
|
-
| `hits` | `int` | `10` | Results per page |
|
|
45
|
-
| `sort` | `SortOrder` | `RELEVANCE` | Sort order |
|
|
46
|
-
| `content_type` | `ContentType` | `None` | Filter by content type |
|
|
47
|
-
| `category` | `str` | `None` | Editorial category (articles only) |
|
|
48
|
-
| `date_range` | `DateRange` | `None` | Publication date filter |
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
|
79
|
-
|
|
80
|
-
| `
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
84
|
-
| `
|
|
85
|
-
| `
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
|
93
|
-
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
96
|
-
| `
|
|
97
|
-
| `
|
|
98
|
-
| `
|
|
99
|
-
| `
|
|
100
|
-
| `
|
|
101
|
-
| `
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
104
|
-
| `
|
|
105
|
-
| `
|
|
106
|
-
| `
|
|
107
|
-
| `
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
-
|
|
1
|
+
# ilpost-api-wrapper
|
|
2
|
+
|
|
3
|
+
A Python wrapper for the [Il Post](https://www.ilpost.it) public search API.
|
|
4
|
+
Searches articles, podcast episodes, and newsletters — no authentication required.
|
|
5
|
+
|
|
6
|
+
## Installation
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
pip install ilpost-api-wrapper
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Requires Python 3.9+. No third-party dependencies.
|
|
13
|
+
|
|
14
|
+
## Quick start
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
from ilpost import IlPostClient, SortOrder, ContentType, DateRange
|
|
18
|
+
|
|
19
|
+
client = IlPostClient()
|
|
20
|
+
|
|
21
|
+
result = client.search("berlusconi")
|
|
22
|
+
for doc in result.docs:
|
|
23
|
+
print(doc.title, doc.link)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## API reference
|
|
27
|
+
|
|
28
|
+
### `IlPostClient(timeout=10)`
|
|
29
|
+
|
|
30
|
+
| Method | Description |
|
|
31
|
+
|--------|-------------|
|
|
32
|
+
| `search(query, ...)` | General search across all content types |
|
|
33
|
+
| `search_articles(query, ...)` | Articles only |
|
|
34
|
+
| `search_podcasts(query, ...)` | Podcast episodes only |
|
|
35
|
+
| `search_newsletters(query, ...)` | Newsletter issues only |
|
|
36
|
+
| `paginate(query, ...)` | Generator that yields one `SearchResult` per page |
|
|
37
|
+
|
|
38
|
+
#### Common parameters
|
|
39
|
+
|
|
40
|
+
| Parameter | Type | Default | Description |
|
|
41
|
+
|-----------|------|---------|-------------|
|
|
42
|
+
| `query` | `str` | — | Search term |
|
|
43
|
+
| `page` | `int` | `1` | Page number (1-based) |
|
|
44
|
+
| `hits` | `int` | `10` | Results per page |
|
|
45
|
+
| `sort` | `SortOrder` | `RELEVANCE` | Sort order |
|
|
46
|
+
| `content_type` | `ContentType` | `None` | Filter by content type |
|
|
47
|
+
| `category` | `str` | `None` | Editorial category (articles only) |
|
|
48
|
+
| `date_range` | `DateRange` | `None` | Publication date filter |
|
|
49
|
+
| `fetch_content` | `bool` | `False` | Scrape and return full article text for each article result (see [`Document.content`](#document)) |
|
|
50
|
+
|
|
51
|
+
> `fetch_content` is available on `search()`, `search_articles()`, and `paginate()`. It has no effect on podcast or newsletter results — `doc.content` will be `None` for those types.
|
|
52
|
+
|
|
53
|
+
#### Enums
|
|
54
|
+
|
|
55
|
+
**`SortOrder`**
|
|
56
|
+
| Value | Description |
|
|
57
|
+
|-------|-------------|
|
|
58
|
+
| `RELEVANCE` | Sort by relevance score (default) |
|
|
59
|
+
| `NEWEST` | Most recent first |
|
|
60
|
+
| `OLDEST` | Oldest first |
|
|
61
|
+
|
|
62
|
+
**`ContentType`**
|
|
63
|
+
| Value | Description |
|
|
64
|
+
|-------|-------------|
|
|
65
|
+
| `ARTICLES` | Articles and news posts |
|
|
66
|
+
| `PODCASTS` | Podcast episodes |
|
|
67
|
+
| `NEWSLETTERS` | Newsletter issues |
|
|
68
|
+
|
|
69
|
+
**`DateRange`**
|
|
70
|
+
| Value | Description |
|
|
71
|
+
|-------|-------------|
|
|
72
|
+
| `ALL_TIME` | Entire archive (default) |
|
|
73
|
+
| `PAST_YEAR` | Past 12 months |
|
|
74
|
+
| `PAST_30_DAYS` | Past 30 days |
|
|
75
|
+
|
|
76
|
+
### `SearchResult`
|
|
77
|
+
|
|
78
|
+
| Attribute | Type | Description |
|
|
79
|
+
|-----------|------|-------------|
|
|
80
|
+
| `total` | `int` | Total number of matching results |
|
|
81
|
+
| `docs` | `list[Document]` | Results for this page |
|
|
82
|
+
| `filters` | `list[FilterGroup]` | Available filters with counts |
|
|
83
|
+
| `sort` | `str` | Active sort value |
|
|
84
|
+
| `hits` | `int` | Page size |
|
|
85
|
+
| `page` | `int` | Current page number |
|
|
86
|
+
| `total_pages` | `int` | Total number of pages |
|
|
87
|
+
| `has_next_page` | `bool` | Whether a next page exists |
|
|
88
|
+
| `has_prev_page` | `bool` | Whether a previous page exists |
|
|
89
|
+
|
|
90
|
+
### `Document`
|
|
91
|
+
|
|
92
|
+
| Attribute | Type | Description |
|
|
93
|
+
|-----------|------|-------------|
|
|
94
|
+
| `id` | `int` | Unique content identifier |
|
|
95
|
+
| `type` | `str` | `"post"`, `"episodes"`, or `"newsletter"` |
|
|
96
|
+
| `title` | `str` | Content title |
|
|
97
|
+
| `link` | `str` | URL to the content page |
|
|
98
|
+
| `timestamp` | `str` | Publication date (ISO 8601, Italian local time) |
|
|
99
|
+
| `summary` | `str` | Short excerpt |
|
|
100
|
+
| `image` | `str` | Cover image URL |
|
|
101
|
+
| `score` | `float` | Relevance score (`0.0` when sorting by date) |
|
|
102
|
+
| `subscriber` | `bool` | `True` if content is paywalled |
|
|
103
|
+
| `highlight` | `str \| None` | Snippet with matched term in `<span>` tags |
|
|
104
|
+
| `category` | `str \| None` | Editorial category (articles only) |
|
|
105
|
+
| `post_tag_text` | `list[str]` | Tags (articles only) |
|
|
106
|
+
| `derived_info` | `dict` | Extra data: episode or newsletter metadata |
|
|
107
|
+
| `content` | `str \| None` | Full article body text, populated when `fetch_content=True` (articles only) |
|
|
108
|
+
| `is_article` | `bool` | Convenience property |
|
|
109
|
+
| `is_podcast` | `bool` | Convenience property |
|
|
110
|
+
| `is_newsletter` | `bool` | Convenience property |
|
|
111
|
+
| `is_paywalled` | `bool` | Alias for `subscriber` |
|
|
112
|
+
|
|
113
|
+
## Examples
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
from ilpost import IlPostClient, SortOrder, ContentType, DateRange
|
|
117
|
+
|
|
118
|
+
client = IlPostClient()
|
|
119
|
+
|
|
120
|
+
# Most recent articles in politics
|
|
121
|
+
result = client.search_articles(
|
|
122
|
+
"renzi",
|
|
123
|
+
sort=SortOrder.NEWEST,
|
|
124
|
+
category="politica",
|
|
125
|
+
date_range=DateRange.PAST_30_DAYS,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# Podcast search
|
|
129
|
+
result = client.search_podcasts("cacao", sort=SortOrder.NEWEST)
|
|
130
|
+
|
|
131
|
+
# Paginate through all results, 5 per page
|
|
132
|
+
for page in client.paginate("sicilia", hits=5, max_pages=10):
|
|
133
|
+
print(f"Page {page.page}/{page.total_pages}")
|
|
134
|
+
for doc in page.docs:
|
|
135
|
+
print(f" [{doc.type}] {doc.title}")
|
|
136
|
+
|
|
137
|
+
# Access filter counts from a response
|
|
138
|
+
result = client.search("europa")
|
|
139
|
+
for group in result.filters:
|
|
140
|
+
print(f"{group.label}:")
|
|
141
|
+
for opt in group.options:
|
|
142
|
+
print(f" {opt.label}: {opt.doc_count}")
|
|
143
|
+
|
|
144
|
+
# Fetch full article text alongside search results
|
|
145
|
+
result = client.search_articles("economia", hits=5, fetch_content=True)
|
|
146
|
+
for doc in result.docs:
|
|
147
|
+
print(doc.title)
|
|
148
|
+
if doc.content:
|
|
149
|
+
print(doc.content[:300])
|
|
150
|
+
|
|
151
|
+
# Use the scraper directly (e.g. for parallel fetching)
|
|
152
|
+
from ilpost import fetch_article_content
|
|
153
|
+
text = fetch_article_content("https://www.ilpost.it/2026/04/02/...")
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## CLI
|
|
157
|
+
|
|
158
|
+
The `ilpost-search` command is included with the package:
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
usage: ilpost-search [-h] [--type {articles,podcasts,newsletters}]
|
|
162
|
+
[--sort {relevance,newest,oldest}]
|
|
163
|
+
[--date {all,year,month}] [--category CATEGORY]
|
|
164
|
+
[--page PAGE] [--hits HITS] [--all-pages]
|
|
165
|
+
[--max-pages N] [--fetch-content]
|
|
166
|
+
query
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Each result is printed with labelled fields: `type`, `category`, `title`, `link`, `date`, `score`, `summary`, and either `content` (when `--fetch-content` is used) or `excerpt` (search highlight).
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# Basic search
|
|
173
|
+
ilpost-search berlusconi
|
|
174
|
+
|
|
175
|
+
# Most recent articles in politics
|
|
176
|
+
ilpost-search renzi --type articles --sort newest --category politica
|
|
177
|
+
|
|
178
|
+
# Podcast search, past 30 days
|
|
179
|
+
ilpost-search cacao --type podcasts --date month
|
|
180
|
+
|
|
181
|
+
# Page 2, 5 results per page, oldest first
|
|
182
|
+
ilpost-search sicilia --sort oldest --hits 5 --page 2
|
|
183
|
+
|
|
184
|
+
# Fetch all pages of newsletter results (up to 3 pages)
|
|
185
|
+
ilpost-search economia --type newsletters --all-pages --max-pages 3
|
|
186
|
+
|
|
187
|
+
# Fetch full article text for each result
|
|
188
|
+
ilpost-search bondi --type articles --hits 3 --fetch-content
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Notes
|
|
192
|
+
|
|
193
|
+
- Paywalled content (`subscriber: true`) is included in search results — title, summary, and highlight are visible, but the full article requires an active ilpost.it subscription.
|
|
194
|
+
- When sorting by date (`NEWEST` or `OLDEST`), `score` is always `0.0`.
|
|
195
|
+
- The `category` filter only applies to articles. It is ignored by the server when `content_type=PODCASTS`.
|
|
196
|
+
- Timestamps are in Italian local time (CET/CEST) with no UTC offset.
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
from .client import IlPostClient
|
|
2
|
-
from .models import SearchResult, Document, FilterGroup, FilterOption, SortOrder, ContentType, DateRange
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
|
|
1
|
+
from .client import IlPostClient
|
|
2
|
+
from .models import SearchResult, Document, FilterGroup, FilterOption, SortOrder, ContentType, DateRange
|
|
3
|
+
from .scraper import ArticleScraper, fetch_article_content
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"IlPostClient",
|
|
7
|
+
"SearchResult",
|
|
8
|
+
"Document",
|
|
9
|
+
"FilterGroup",
|
|
10
|
+
"FilterOption",
|
|
11
|
+
"SortOrder",
|
|
12
|
+
"ContentType",
|
|
13
|
+
"DateRange",
|
|
14
|
+
"ArticleScraper",
|
|
15
|
+
"fetch_article_content",
|
|
16
|
+
]
|