4.1
- NEW: Soup Sieve is now thread safe, and this is now tested, including on free-threaded Python. This is assuming
read only operations on a document. Check out our documentation for more details. - FIX: Fix a race where compiling selectors in multiple threads at the same time could fail with a bogus
syntax error or silently parse a selector incorrectly. - FIX: Fix issue where trailing whitespace and comments can sometimes fail to be consumed properly.
- FIX: Fix a selector that starts with a comment followed by whitespace, such as
/* comment */ div, failing
with a syntax error. - FIX: Custom selector names should be checked with ASCII only lowercase.
- FIX: Fix
[attr=value],[attr$=value],[attr|=value], and[attr!=value]ignoring a trailing newline in
the attribute value, so[type=hidden]no longer matchestype="hidden ". - FIX: Cache the language, the
contenteditablestate, theselectof anoption, and the tree that an element
is in, as found from its ancestors, when matching:lang(),:read-write,:read-only,:checked,:default,
and:indeterminateto avoid quadratic time on deeply nested documents. - FIX: Fix
:lang('')not matching every element without any language information, which per the HTML spec has
an empty language tag. It missed the first such element checked, or all of them when there was nohead. - FIX:
:lang()no longer matches an element whose language tag is not well-formed BCP 47 syntax, such as-,
en-,en_US, or a subtag longer than 8 characters, and a language range that is not well-formed matches
nothing. Previously,lang="-"matched:lang(''), and ill-formed tags matched:lang('*'). - FIX: Fix
:lang()ranges that end in a wildcard, such asen-*or*-*, never matching. As RFC 4647 extended
filtering specifies, wildcards after the first subtag are ignored, soen-*matches the same asen. - FIX: Fix
[attr*=value]and[attr$=value]taking time quadratic in the length of the value when it nearly
matches a long attribute value, including when matching case insensitive.