# What changed in soupsieve

> 12 changes in soupsieve 3 from its official release notes, upgrade guides and advisories: 2 breaking. Each one cited. Sources checked 2026-10-28. HTML: https://unstale.sh/pypi/soupsieve/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## soupsieve 3

### Breaking changes

- Only non-ASCII identifier code points remain unescaped; all other non-ASCII characters are escaped, as defined by the CSS specification. (3.0.4) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.4)
- Soup Sieve 3.0+ requires Python 3.11.5 or later because earlier versions have broken possessive quantifiers. (3.0.2) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.2)

### Performance

- Caches resolved directionality when matching :dir() to avoid quadratic time on deeply nested dir="auto" elements. (3.0.4) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.4)

### Fixes and other changes

- Unescaped U+0080–U+009F characters in identifiers are allowed to match browser behavior. (3.0.4) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.4)
- Elements with dir="auto" or <bdi> and no strong direction characters are assumed left-to-right, rather than inheriting the parent's direction. (3.0.4) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.4)
- Prevents :in-range and :out-of-range from raising ValueError for week inputs whose week-year is 10000 or greater. (3.0.4) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.4)
- Corrects :in-range and :out-of-range handling of time and datetime-local values that include seconds. (3.0.4) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.4)
- Corrects matching for :nth-last-child(an+b of S) when the first sibling tested does not match S. (3.0.4) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.4)
- Numeric input ranges match correctly when values or bounds use scientific notation. (3.0.4) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.4)
- Keeps own and descendant text separate when combining :soup-contains() and :soup-contains-own(). (3.0.4) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.4)
- When matching with `>`, the `BeautifulSoup` object no longer counts as a parent. (3.0.3) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.3)
- Relative sibling matching under `:has(~)` no longer incorrectly matches a sibling that came before the target element. (3.0.3) — [release notes](https://github.com/facelessuser/soupsieve/releases/tag/3.0.3)
