selectolax 0.3.28__cp313-cp313-musllinux_1_2_aarch64.whl → 0.4.0__cp313-cp313-musllinux_1_2_aarch64.whl

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.

Potentially problematic release.


This version of selectolax might be problematic. Click here for more details.

selectolax/parser.pyx CHANGED
@@ -1,5 +1,6 @@
1
1
 
2
- from cpython cimport bool
2
+ from cpython.bool cimport bool
3
+ from cpython.exc cimport PyErr_SetObject
3
4
 
4
5
  include "modest/selection.pxi"
5
6
  include "modest/node.pxi"
@@ -61,8 +62,7 @@ cdef class HTMLParser:
61
62
 
62
63
  """
63
64
 
64
- node = Node()
65
- node._init(self.html_tree.node_html, self)
65
+ cdef Node node = Node.new(self.html_tree.node_html, self)
66
66
  return node.css(query)
67
67
 
68
68
  def css_first(self, str query, default=None, strict=False):
@@ -72,9 +72,9 @@ cdef class HTMLParser:
72
72
  ----------
73
73
 
74
74
  query : str
75
- default : bool, default None
75
+ default : Any, default None
76
76
  Default value to return if there is no match.
77
- strict: bool, default True
77
+ strict: bool, default False
78
78
  Set to True if you want to check if there is strictly only one match in the document.
79
79
 
80
80
 
@@ -84,12 +84,11 @@ cdef class HTMLParser:
84
84
 
85
85
  """
86
86
 
87
- node = Node()
88
- node._init(self.html_tree.node_html, self)
87
+ cdef Node node = Node.new(self.html_tree.node_html, self)
89
88
  return node.css_first(query, default, strict)
90
89
 
91
90
  cdef void _detect_encoding(self, char* html, size_t html_len) nogil:
92
- cdef myencoding_t encoding = MyENCODING_DEFAULT;
91
+ cdef myencoding_t encoding = MyENCODING_DEFAULT
93
92
 
94
93
  if self.use_meta_tags:
95
94
  encoding = myencoding_prescan_stream_to_determine_encoding(html, html_len)
@@ -102,7 +101,7 @@ cdef class HTMLParser:
102
101
 
103
102
  self._encoding = encoding
104
103
 
105
- cdef _parse_html(self, char* html, size_t html_len):
104
+ cdef int _parse_html(self, char* html, size_t html_len) except -1:
106
105
  cdef myhtml_t* myhtml
107
106
  cdef mystatus_t status
108
107
 
@@ -111,23 +110,28 @@ cdef class HTMLParser:
111
110
  status = myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0)
112
111
 
113
112
  if status != 0:
114
- raise RuntimeError("Can't init MyHTML object.")
113
+ PyErr_SetObject(RuntimeError, "Can't init MyHTML object.")
114
+ return -1
115
115
 
116
116
  with nogil:
117
117
  self.html_tree = myhtml_tree_create()
118
118
  status = myhtml_tree_init(self.html_tree, myhtml)
119
119
 
120
120
  if status != 0:
121
- raise RuntimeError("Can't init MyHTML Tree object.")
121
+ PyErr_SetObject(RuntimeError, "Can't init MyHTML Tree object.")
122
+ return -1
122
123
 
123
124
  with nogil:
124
125
  status = myhtml_parse(self.html_tree, self._encoding, html, html_len)
125
126
 
126
127
  if status != 0:
127
- raise RuntimeError("Can't parse HTML:\n%s" % str(html))
128
-
129
- assert self.html_tree.node_html != NULL
128
+ PyErr_SetObject(RuntimeError, "Can't parse HTML (status code: %d)" % status)
129
+ return -1
130
130
 
131
+ if self.html_tree.node_html == NULL:
132
+ PyErr_SetObject(RuntimeError, "html_tree is still NULL even after parsing ")
133
+ return -1
134
+ return 0
131
135
 
132
136
  @property
133
137
  def input_encoding(self):
@@ -147,9 +151,11 @@ cdef class HTMLParser:
147
151
  def root(self):
148
152
  """Returns root node."""
149
153
  if self.html_tree and self.html_tree.node_html:
150
- node = Node()
151
- node._init(self.html_tree.node_html, self)
152
- return node
154
+ try:
155
+ return Node.new(self.html_tree.node_html, self)
156
+ except Exception:
157
+ # If Node creation or initialization fails, return None
158
+ return None
153
159
  return None
154
160
 
155
161
  @property
@@ -159,9 +165,7 @@ cdef class HTMLParser:
159
165
  head = myhtml_tree_get_node_head(self.html_tree)
160
166
 
161
167
  if head != NULL:
162
- node = Node()
163
- node._init(head, self)
164
- return node
168
+ return Node.new(head, self)
165
169
  return None
166
170
 
167
171
  @property
@@ -171,10 +175,7 @@ cdef class HTMLParser:
171
175
  body = myhtml_tree_get_node_body(self.html_tree)
172
176
 
173
177
  if body != NULL:
174
- node = Node()
175
- node._init(body, self)
176
- return node
177
-
178
+ return Node.new(body, self)
178
179
  return None
179
180
 
180
181
  def tags(self, str name):
@@ -185,9 +186,15 @@ cdef class HTMLParser:
185
186
  name : str (e.g. div)
186
187
 
187
188
  """
189
+ # Validate tag name
190
+ if not name:
191
+ raise ValueError("Tag name cannot be empty")
192
+ if len(name) > 100: # Reasonable limit for tag names
193
+ raise ValueError("Tag name is too long")
194
+
188
195
  cdef myhtml_collection_t* collection = NULL
189
196
  pybyte_name = name.encode('UTF-8')
190
- cdef mystatus_t status = 0;
197
+ cdef mystatus_t status = 0
191
198
 
192
199
  result = list()
193
200
  collection = myhtml_get_nodes_by_name(self.html_tree, NULL, pybyte_name, len(pybyte_name), &status)
@@ -197,8 +204,7 @@ cdef class HTMLParser:
197
204
 
198
205
  if status == 0:
199
206
  for i in range(collection.length):
200
- node = Node()
201
- node._init(collection.list[i], self)
207
+ node = Node.new(collection.list[i], self)
202
208
  result.append(node)
203
209
 
204
210
  myhtml_collection_destroy(collection)
@@ -248,7 +254,7 @@ cdef class HTMLParser:
248
254
  """
249
255
  cdef myhtml_collection_t* collection = NULL
250
256
 
251
- cdef mystatus_t status = 0;
257
+ cdef mystatus_t status = 0
252
258
 
253
259
  for tag in tags:
254
260
  pybyte_name = tag.encode('UTF-8')
@@ -268,8 +274,7 @@ cdef class HTMLParser:
268
274
 
269
275
  myhtml_collection_destroy(collection)
270
276
 
271
-
272
- def unwrap_tags(self, list tags):
277
+ def unwrap_tags(self, list tags, delete_empty : bool = False):
273
278
  """Unwraps specified tags from the HTML tree.
274
279
 
275
280
  Works the same as th `unwrap` method, but applied to a list of tags.
@@ -278,6 +283,8 @@ cdef class HTMLParser:
278
283
  ----------
279
284
  tags : list
280
285
  List of tags to remove.
286
+ delete_empty : bool, default False
287
+ If True, removes empty tags.
281
288
 
282
289
  Examples
283
290
  --------
@@ -288,14 +295,14 @@ cdef class HTMLParser:
288
295
  '<body><div>Hello world!</div></body>'
289
296
  """
290
297
  if self.root is not None:
291
- self.root.unwrap_tags(tags)
298
+ self.root.unwrap_tags(tags, delete_empty=delete_empty)
292
299
 
293
300
  @property
294
301
  def html(self):
295
302
  """Return HTML representation of the page."""
296
- if self.html_tree and self.html_tree.document:
297
- node = Node()
298
- node._init(self.html_tree.document, self)
303
+ cdef Node node
304
+ if self.html_tree != NULL and self.html_tree.document != NULL:
305
+ node = Node.new(self.html_tree.document, self)
299
306
  return node.html
300
307
  return None
301
308
 
@@ -349,6 +356,7 @@ cdef class HTMLParser:
349
356
 
350
357
  def css_matches(self, str selector):
351
358
  return self.root.css_matches(selector)
359
+
352
360
  def merge_text_nodes(self):
353
361
  """Iterates over all text nodes and merges all text nodes that are close to each other.
354
362
 
@@ -368,6 +376,7 @@ cdef class HTMLParser:
368
376
  "John Doe"
369
377
  """
370
378
  return self.root.merge_text_nodes()
379
+
371
380
  @staticmethod
372
381
  cdef HTMLParser from_tree(
373
382
  myhtml_tree_t * tree, bytes raw_html, bint detect_encoding, bint use_meta_tags, str decode_errors,
@@ -384,13 +393,13 @@ cdef class HTMLParser:
384
393
  obj.cached_script_srcs = None
385
394
  return obj
386
395
 
387
-
388
396
  def clone(self):
389
397
  """Clone the current tree."""
390
398
  cdef myhtml_t* myhtml
391
399
  cdef mystatus_t status
392
400
  cdef myhtml_tree_t* html_tree
393
401
  cdef myhtml_tree_node_t* node
402
+ cdef HTMLParser cls
394
403
 
395
404
  with nogil:
396
405
  myhtml = myhtml_create()
@@ -426,6 +435,7 @@ cdef class HTMLParser:
426
435
  if self.html_tree != NULL:
427
436
  myhtml = self.html_tree.myhtml
428
437
  myhtml_tree_destroy(self.html_tree)
438
+ self.html_tree = NULL # Prevent double-free
429
439
  if myhtml != NULL:
430
440
  myhtml_destroy(myhtml)
431
441
 
selectolax/utils.pxi CHANGED
@@ -4,6 +4,16 @@ MAX_HTML_INPUT_SIZE = 250e+7
4
4
 
5
5
  ParserCls = Union[Type["HTMLParser"], Type["LexborHTMLParser"]]
6
6
  Parser = Union["HTMLParser", "LexborHTMLParser"]
7
+ FRAGMENT = Literal[
8
+ "document",
9
+ "fragment",
10
+ "head",
11
+ "body",
12
+ "head_and_body",
13
+ "document_no_head",
14
+ "document_no_body",
15
+ "document_no_head_no_body",
16
+ ]
7
17
 
8
18
 
9
19
  def preprocess_input(html, decode_errors='ignore'):
@@ -29,10 +39,10 @@ def get_fragment_type(
29
39
  html: str,
30
40
  parser_cls: ParserCls,
31
41
  tree: Optional[Parser] = None,
32
- ) -> Literal["document", "fragment", "head", "body", "head_and_body", "document_no_head", "document_no_body", "document_no_head_no_body"]:
42
+ ) -> FRAGMENT:
33
43
  if not tree:
34
44
  tree = parser_cls(html)
35
-
45
+
36
46
  import re
37
47
  html_re = re.compile(r"<html|<body|<head(?!er)", re.IGNORECASE)
38
48
 
@@ -49,7 +59,7 @@ def get_fragment_type(
49
59
 
50
60
  if has_html and has_head and has_body:
51
61
  break
52
-
62
+
53
63
  if has_html and has_head and has_body:
54
64
  return "document"
55
65
  elif has_html and not has_head and has_body:
@@ -0,0 +1,32 @@
1
+ Metadata-Version: 2.4
2
+ Name: selectolax
3
+ Version: 0.4.0
4
+ Summary: Fast HTML5 parser with CSS selectors.
5
+ Home-page: https://github.com/rushter/selectolax
6
+ Author: Artem Golubin
7
+ Author-email: Artem Golubin <me@rushter.com>
8
+ License-Expression: MIT
9
+ Project-URL: Repository, https://github.com/rushter/selectolax
10
+ Project-URL: Documentation, https://selectolax.readthedocs.io/en/latest/parser.html
11
+ Project-URL: Changelog, https://github.com/rushter/selectolax/blob/master/CHANGES.md
12
+ Keywords: selectolax,html,parser,css,fast
13
+ Classifier: Development Status :: 5 - Production/Stable
14
+ Classifier: Topic :: Text Processing :: Markup :: HTML
15
+ Classifier: Topic :: Internet
16
+ Classifier: Topic :: Internet :: WWW/HTTP
17
+ Classifier: Intended Audience :: Developers
18
+ Classifier: Natural Language :: English
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Requires-Python: >=3.9
26
+ Description-Content-Type: text/x-rst
27
+ License-File: LICENSE
28
+ Provides-Extra: cython
29
+ Requires-Dist: Cython; extra == "cython"
30
+ Dynamic: author
31
+ Dynamic: home-page
32
+ Dynamic: license-file
@@ -0,0 +1,27 @@
1
+ selectolax/__init__.py,sha256=CnY6a5BeJexKaFN_b2L28F5AVD1jPM1lFz9kfS6RC5w,148
2
+ selectolax/base.pxi,sha256=eiPKlY9gG3l49qJoRQVLl1Ljza6z1k0A-met6sDPcqE,89
3
+ selectolax/lexbor.c,sha256=uyvVzFr0FZyq_yL-qT-ZZCizC69Noq0aeM5jSruq6wM,2445661
4
+ selectolax/lexbor.cpython-313-aarch64-linux-musl.so,sha256=jCYG-Hv5cITmK1G9mzxQjvFbe1CdUXYzvFtiByunUqU,4125992
5
+ selectolax/lexbor.pxd,sha256=cAitQeHgGxp5Aac-o5aaOyg6_IiOpp3Rg0JNlz8Cstk,21652
6
+ selectolax/lexbor.pyi,sha256=MDQ4YQWcywG3oeSITWifMkCsa09MmPbyXMQq06wqwAY,30092
7
+ selectolax/lexbor.pyx,sha256=-QsF8Ru8DvWEEy3AIjXDdoKTG5saocX-HkTE_feS6tQ,13468
8
+ selectolax/parser.c,sha256=pFUbwlf1TmgyaPICOdTdEAZIjaytK6foTCSck95-iZ4,2210172
9
+ selectolax/parser.cpython-313-aarch64-linux-musl.so,sha256=Nf7ql5X1U9kQ_MIDwYK8QdNPDReuKrlgg0UHLYshSDA,3346528
10
+ selectolax/parser.pxd,sha256=BQSlDGibVfqFDhfqX6l5sBnfkHEETxlj-eSpGWERKEs,24618
11
+ selectolax/parser.pyi,sha256=qi9AHy_DWalANSOVTN6gbtbf-YJZCfE7i12aWJbrUp8,24929
12
+ selectolax/parser.pyx,sha256=sBq2_HR83Ek8yqnFBYrG2xBBCM4S6Jiiie_xq5O_twE,13684
13
+ selectolax/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ selectolax/utils.pxi,sha256=_g-ZLprPgbqv7BLs-WEe8IhbDd_QTcfirz_NEyR1Yww,3506
15
+ selectolax/lexbor/attrs.pxi,sha256=eH90zJYHicffTzC7peIitHkOqyIw3xzomhJHxJv9hP8,3858
16
+ selectolax/lexbor/node.pxi,sha256=Sj5Kx_I2vBarZRNrYhPk2TufhEYYNlV9wnSbLACyZMQ,35311
17
+ selectolax/lexbor/node_remove.pxi,sha256=iqJ2PPNvQmK2dq8kJLXiZawoGf1Az3MpbrlQI6k4jDM,760
18
+ selectolax/lexbor/selection.pxi,sha256=ZJ5ed7YgxvcsOW_qPbMhUQRKgChl9cih1n1d5elfTZ8,8030
19
+ selectolax/lexbor/util.pxi,sha256=hqMQU1O_5O82ThjUzk8NxQPl-Kg29DDGFFpC46LcejI,564
20
+ selectolax/modest/node.pxi,sha256=l0aQf2Ojpzxh-L-0KxLetG7uGgGhkV7Cqgfy8O_5ch4,33786
21
+ selectolax/modest/selection.pxi,sha256=m4GDpl0aI7lSWHFeBBheroUKDrZgJcc6uVubtzrXL1M,6508
22
+ selectolax/modest/util.pxi,sha256=di9cLmAyuGFXmiuptZ7Fz1SgkCf7hmiZLnpKCKEKsUc,552
23
+ selectolax-0.4.0.dist-info/METADATA,sha256=xFNpvUeepMxneDCjZoP5kTv4nBQccf5_wyWieI3BFnY,1287
24
+ selectolax-0.4.0.dist-info/WHEEL,sha256=3IjWZRuuq2q-vKtU0x2XxSbfx92VUEmTDWR0AUEtZxI,113
25
+ selectolax-0.4.0.dist-info/top_level.txt,sha256=e5MuEM2PrQzoDlWetkFli9uXSlxa_ktW5jJEihhaI1c,11
26
+ selectolax-0.4.0.dist-info/RECORD,,
27
+ selectolax-0.4.0.dist-info/licenses/LICENSE,sha256=MYCcM-Cv_rC2-lQiwDumin0E-rMXAhK-qIGGA29434Y,1077
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp313-cp313-musllinux_1_2_aarch64
5
5
 
@@ -1,193 +0,0 @@
1
- Metadata-Version: 2.2
2
- Name: selectolax
3
- Version: 0.3.28
4
- Summary: Fast HTML5 parser with CSS selectors.
5
- Home-page: https://github.com/rushter/selectolax
6
- Author: Artem Golubin
7
- Author-email: me@rushter.com
8
- License: MIT license
9
- Project-URL: Source code, https://github.com/rushter/selectolax
10
- Keywords: selectolax
11
- Classifier: Development Status :: 5 - Production/Stable
12
- Classifier: Topic :: Text Processing :: Markup :: HTML
13
- Classifier: Topic :: Internet
14
- Classifier: Topic :: Internet :: WWW/HTTP
15
- Classifier: Intended Audience :: Developers
16
- Classifier: License :: OSI Approved :: MIT License
17
- Classifier: Natural Language :: English
18
- Classifier: Programming Language :: Python :: 3
19
- Classifier: Programming Language :: Python :: 3.7
20
- Classifier: Programming Language :: Python :: 3.8
21
- Classifier: Programming Language :: Python :: 3.9
22
- Classifier: Programming Language :: Python :: 3.10
23
- Classifier: Programming Language :: Python :: 3.11
24
- Classifier: Programming Language :: Python :: 3.12
25
- Classifier: Programming Language :: Python :: 3.13
26
- License-File: LICENSE
27
- Provides-Extra: cython
28
- Requires-Dist: Cython==3.0.11; extra == "cython"
29
- Dynamic: author
30
- Dynamic: author-email
31
- Dynamic: classifier
32
- Dynamic: description
33
- Dynamic: home-page
34
- Dynamic: keywords
35
- Dynamic: license
36
- Dynamic: project-url
37
- Dynamic: provides-extra
38
- Dynamic: summary
39
-
40
- .. image:: docs/logo.png
41
- :alt: selectolax logo
42
-
43
- -------------------------
44
-
45
- .. image:: https://img.shields.io/pypi/v/selectolax.svg
46
- :target: https://pypi.python.org/pypi/selectolax
47
-
48
- A fast HTML5 parser with CSS selectors using `Modest <https://github.com/lexborisov/Modest/>`_ and
49
- `Lexbor <https://github.com/lexbor/lexbor>`_ engines.
50
-
51
-
52
- Installation
53
- ------------
54
- From PyPI using pip:
55
-
56
- .. code-block:: bash
57
-
58
- pip install selectolax
59
-
60
- If installation fails due to compilation errors, you may need to install `Cython <https://github.com/cython/cython>`_:
61
-
62
- .. code-block:: bash
63
-
64
- pip install selectolax[cython]
65
-
66
- This usually happens when you try to install an outdated version of selectolax on a newer version of Python.
67
-
68
-
69
- Development version from GitHub:
70
-
71
- .. code-block:: bash
72
-
73
- git clone --recursive https://github.com/rushter/selectolax
74
- cd selectolax
75
- pip install -r requirements_dev.txt
76
- python setup.py install
77
-
78
- How to compile selectolax while developing:
79
-
80
- .. code-block:: bash
81
-
82
- make clean
83
- make dev
84
-
85
- Basic examples
86
- --------------
87
-
88
- Here are some basic examples to get you started with selectolax:
89
-
90
- Parsing HTML and extracting text:
91
-
92
- .. code:: python
93
-
94
- In [1]: from selectolax.parser import HTMLParser
95
- ...:
96
- ...: html = """
97
- ...: <h1 id="title" data-updated="20201101">Hi there</h1>
98
- ...: <div class="post">Lorem Ipsum is simply dummy text of the printing and typesetting industry. </div>
99
- ...: <div class="post">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
100
- ...: """
101
- ...: tree = HTMLParser(html)
102
-
103
- In [2]: tree.css_first('h1#title').text()
104
- Out[2]: 'Hi there'
105
-
106
- In [3]: tree.css_first('h1#title').attributes
107
- Out[3]: {'id': 'title', 'data-updated': '20201101'}
108
-
109
- In [4]: [node.text() for node in tree.css('.post')]
110
- Out[4]:
111
- ['Lorem Ipsum is simply dummy text of the printing and typesetting industry. ',
112
- 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.']
113
-
114
- Using advanced CSS selectors:
115
-
116
- .. code:: python
117
-
118
- In [1]: html = "<div><p id=p1><p id=p2><p id=p3><a>link</a><p id=p4><p id=p5>text<p id=p6></div>"
119
- ...: selector = "div > :nth-child(2n+1):not(:has(a))"
120
-
121
- In [2]: for node in HTMLParser(html).css(selector):
122
- ...: print(node.attributes, node.text(), node.tag)
123
- ...: print(node.parent.tag)
124
- ...: print(node.html)
125
- ...:
126
- {'id': 'p1'} p
127
- div
128
- <p id="p1"></p>
129
- {'id': 'p5'} text p
130
- div
131
- <p id="p5">text</p>
132
-
133
-
134
- * `Detailed overview <https://github.com/rushter/selectolax/blob/master/examples/walkthrough.ipynb>`_
135
-
136
- Available backends
137
- ------------------
138
-
139
- Selectolax supports two backends: ``Modest`` and ``Lexbor``. By default, all examples use the Modest backend.
140
- Most of the features between backends are almost identical, but there are still some differences.
141
-
142
- As of 2024, the preferred backend is ``Lexbor``. The ``Modest`` backend is still available for compatibility reasons
143
- and the underlying C library that selectolax uses is not maintained anymore.
144
-
145
-
146
- To use ``lexbor``, just import the parser and use it in the similar way to the `HTMLParser`.
147
-
148
- .. code:: python
149
-
150
- In [1]: from selectolax.lexbor import LexborHTMLParser
151
-
152
- In [2]: html = """
153
- ...: <title>Hi there</title>
154
- ...: <div id="updated">2021-08-15</div>
155
- ...: """
156
-
157
- In [3]: parser = LexborHTMLParser(html)
158
- In [4]: parser.root.css_first("#updated").text()
159
- Out[4]: '2021-08-15'
160
-
161
-
162
- Simple Benchmark
163
- ----------------
164
-
165
- * Extract title, links, scripts and a meta tag from main pages of top 754 domains. See ``examples/benchmark.py`` for more information.
166
-
167
- ============================ ===========
168
- Package Time
169
- ============================ ===========
170
- Beautiful Soup (html.parser) 61.02 sec.
171
- lxml / Beautiful Soup (lxml) 9.09 sec.
172
- html5_parser 16.10 sec.
173
- selectolax (Modest) 2.94 sec.
174
- selectolax (Lexbor) 2.39 sec.
175
- ============================ ===========
176
-
177
- Links
178
- -----
179
-
180
- * `selectolax API reference <http://selectolax.readthedocs.io/en/latest/parser.html>`_
181
- * `Video introduction to web scraping using selectolax <https://youtu.be/HpRsfpPuUzE>`_
182
- * `How to Scrape 7k Products with Python using selectolax and httpx <https://www.youtube.com/watch?v=XpGvq755J2U>`_
183
- * `Detailed overview <https://github.com/rushter/selectolax/blob/master/examples/walkthrough.ipynb>`_
184
- * `Modest introduction <https://lexborisov.github.io/Modest/>`_
185
- * `Modest benchmark <http://lexborisov.github.io/benchmark-html-persers/>`_
186
- * `Python benchmark <https://rushter.com/blog/python-fast-html-parser/>`_
187
- * `Another Python benchmark <https://www.peterbe.com/plog/selectolax-or-pyquery>`_
188
-
189
- License
190
- -------
191
-
192
- * Modest engine — `LGPL2.1 <https://github.com/lexborisov/Modest/blob/master/LICENSE>`_
193
- * selectolax - `MIT <https://github.com/rushter/selectolax/blob/master/LICENSE>`_
@@ -1,26 +0,0 @@
1
- selectolax-0.3.28.dist-info/LICENSE,sha256=MYCcM-Cv_rC2-lQiwDumin0E-rMXAhK-qIGGA29434Y,1077
2
- selectolax-0.3.28.dist-info/WHEEL,sha256=C2YmkPORi3kUV_1eSP_KAkDGyxlqzWM_fErSHnfQH5Q,113
3
- selectolax-0.3.28.dist-info/METADATA,sha256=i_MaZlvsWpwfXL4KIPY7L04XUq-72PaCHq70tucayU8,6255
4
- selectolax-0.3.28.dist-info/top_level.txt,sha256=e5MuEM2PrQzoDlWetkFli9uXSlxa_ktW5jJEihhaI1c,11
5
- selectolax-0.3.28.dist-info/RECORD,,
6
- selectolax/parser.pxd,sha256=zZlg1vHUg6o4MXaiwKAo5S5hO_DqBGc4_E10qJ2EcM4,24564
7
- selectolax/__init__.py,sha256=IhnQaAtBWz03SUIe66y78uQqmWBontg4z13rRupwa7Q,175
8
- selectolax/base.pxi,sha256=eiPKlY9gG3l49qJoRQVLl1Ljza6z1k0A-met6sDPcqE,89
9
- selectolax/lexbor.pyi,sha256=gf0rPd2B1EZyz_oN6EER-wFojg__Sz18GwjjVYo7SkU,6552
10
- selectolax/parser.pyi,sha256=qLkvStGG4K3daXChLChzPHGV5w5gmIEMvFwRpC_Q4EM,11561
11
- selectolax/parser.cpython-313-aarch64-linux-musl.so,sha256=hziWiiAJTjrMvBZWbfz9BA-AZUb5rZpJCj0a6zkEOVU,7745096
12
- selectolax/utils.pxi,sha256=uB0-0naFQPy1JpR2DiIlKnyLyC76yWLnUHSuH11xg6s,3459
13
- selectolax/parser.c,sha256=yd8gEU0netTAe3rf5haknFFz-QtMHTi6nhKGW5GUTTE,2214825
14
- selectolax/lexbor.pxd,sha256=PwygBdb1blWAQcxXubZS5uffhgcXaqgySNMPFMT02-c,20958
15
- selectolax/lexbor.pyx,sha256=rpb32yQ2E_6nJeaPDQs3kb3GFoALZqQbVCN35kcUM-M,10882
16
- selectolax/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- selectolax/parser.pyx,sha256=o1HkYE_nQr3TS7EPlldJx2-ygU9B5FI2uWYFzdF-VaI,12953
18
- selectolax/lexbor.cpython-313-aarch64-linux-musl.so,sha256=xK48YWpB7mhrulSscdGa9WejHi1ZtrFGiojHSnOrl4U,9490032
19
- selectolax/lexbor.c,sha256=UkiarPPcp6IKa-HMZLnhap1CRltADEZdwsDWo5EviLQ,2359509
20
- selectolax/modest/util.pxi,sha256=aX9UnRNTITImHVBTlIs9efOd3EyugLq_Lwuo0zVTiuQ,551
21
- selectolax/modest/node.pxi,sha256=NrMzJnQJDCmgTHpUxpMHDyAfQ_AS_n_Cr_2ryEKjyL0,32550
22
- selectolax/modest/selection.pxi,sha256=S55MMxEW2B1oPExB_DRwPM46WoWZU73J3rFRZU1URuQ,6393
23
- selectolax/lexbor/attrs.pxi,sha256=Ol2RNzXZAcWaqJdDBUe0ChOCcA8HC990Hjncj98XAkw,3138
24
- selectolax/lexbor/util.pxi,sha256=Zq7S-zlyU3wOo49wGHQHnmmhpbkrcJm59ZCTPENcZQA,563
25
- selectolax/lexbor/node.pxi,sha256=-cqsA4gz9yL6hCte6uGgdQKvhIBZF_BZc_xHJn0rkCM,29340
26
- selectolax/lexbor/selection.pxi,sha256=FA6npHtXjJjvS8H2_e_LS53i5zbpGYgb5zTh5Tf_XQY,6571