Skip to content

Commit 7f320c6

Browse files
Stubs for beautifulsoup4 (#5758)
Stubgen and manual fixes, don't bother with Python 2
1 parent e676fca commit 7f320c6

13 files changed

+778
-1
lines changed

pyrightconfig.stricter.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@
4949
"stubs/simplejson",
5050
"stubs/vobject",
5151
"stubs/waitress",
52-
"stubs/Werkzeug"
52+
"stubs/Werkzeug",
53+
"stubs/beautifulsoup4",
5354
],
5455
"typeCheckingMode": "basic",
5556
"strictListInference": true,
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
html5lib
2+
lxml
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
bs4.element.NavigableString.string # created through __getattr__

stubs/beautifulsoup4/METADATA.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
version = "4.9"

stubs/beautifulsoup4/bs4/__init__.pyi

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from _typeshed import Self, SupportsRead
2+
from typing import Any, List, Sequence, Type
3+
4+
from .builder import TreeBuilder
5+
from .element import PageElement, SoupStrainer, Tag
6+
from .formatter import Formatter
7+
8+
class GuessedAtParserWarning(UserWarning): ...
9+
class MarkupResemblesLocatorWarning(UserWarning): ...
10+
11+
class BeautifulSoup(Tag):
12+
ROOT_TAG_NAME: str
13+
DEFAULT_BUILDER_FEATURES: List[str]
14+
ASCII_SPACES: str
15+
NO_PARSER_SPECIFIED_WARNING: str
16+
element_classes: Any
17+
builder: TreeBuilder
18+
is_xml: bool
19+
known_xml: bool
20+
parse_only: SoupStrainer | None
21+
markup: str
22+
def __init__(
23+
self,
24+
markup: str | bytes | SupportsRead[str] | SupportsRead[bytes] = ...,
25+
features: str | Sequence[str] | None = ...,
26+
builder: TreeBuilder | Type[TreeBuilder] | None = ...,
27+
parse_only: SoupStrainer | None = ...,
28+
from_encoding: str | None = ...,
29+
exclude_encodings: Sequence[str] | None = ...,
30+
element_classes: dict[Type[PageElement], Type[Any]] | None = ...,
31+
**kwargs,
32+
) -> None: ...
33+
def __copy__(self: Self) -> Self: ...
34+
hidden: bool
35+
current_data: Any
36+
currentTag: Any
37+
tagStack: Any
38+
open_tag_counter: Any
39+
preserve_whitespace_tag_stack: Any
40+
string_container_stack: Any
41+
def reset(self) -> None: ...
42+
def new_tag(
43+
self,
44+
name,
45+
namespace: Any | None = ...,
46+
nsprefix: Any | None = ...,
47+
attrs=...,
48+
sourceline: Any | None = ...,
49+
sourcepos: Any | None = ...,
50+
**kwattrs,
51+
) -> Tag: ...
52+
def string_container(self, base_class: Any | None = ...): ...
53+
def new_string(self, s, subclass: Any | None = ...): ...
54+
def insert_before(self, *args) -> None: ...
55+
def insert_after(self, *args) -> None: ...
56+
def popTag(self): ...
57+
def pushTag(self, tag) -> None: ...
58+
def endData(self, containerClass: Any | None = ...) -> None: ...
59+
def object_was_parsed(self, o, parent: Any | None = ..., most_recent_element: Any | None = ...) -> None: ...
60+
def handle_starttag(self, name, namespace, nsprefix, attrs, sourceline: Any | None = ..., sourcepos: Any | None = ...): ...
61+
def handle_endtag(self, name, nsprefix: Any | None = ...) -> None: ...
62+
def handle_data(self, data) -> None: ...
63+
def decode(self, pretty_print: bool = ..., eventual_encoding: str = ..., formatter: str | Formatter = ...): ... # type: ignore # missing some arguments
64+
65+
class BeautifulStoneSoup(BeautifulSoup): ...
66+
class StopParsing(Exception): ...
67+
class FeatureNotFound(ValueError): ...
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from typing import Any
2+
3+
class TreeBuilderRegistry:
4+
builders_for_feature: Any
5+
builders: Any
6+
def __init__(self) -> None: ...
7+
def register(self, treebuilder_class) -> None: ...
8+
def lookup(self, *features): ...
9+
10+
class TreeBuilder:
11+
NAME: str
12+
ALTERNATE_NAMES: Any
13+
features: Any
14+
is_xml: bool
15+
picklable: bool
16+
empty_element_tags: Any
17+
DEFAULT_CDATA_LIST_ATTRIBUTES: Any
18+
DEFAULT_PRESERVE_WHITESPACE_TAGS: Any
19+
DEFAULT_STRING_CONTAINERS: Any
20+
USE_DEFAULT: Any
21+
TRACKS_LINE_NUMBERS: bool
22+
soup: Any
23+
cdata_list_attributes: Any
24+
preserve_whitespace_tags: Any
25+
store_line_numbers: Any
26+
string_containers: Any
27+
def __init__(
28+
self, multi_valued_attributes=..., preserve_whitespace_tags=..., store_line_numbers=..., string_containers=...
29+
) -> None: ...
30+
def initialize_soup(self, soup) -> None: ...
31+
def reset(self) -> None: ...
32+
def can_be_empty_element(self, tag_name): ...
33+
def feed(self, markup) -> None: ...
34+
def prepare_markup(
35+
self,
36+
markup,
37+
user_specified_encoding: Any | None = ...,
38+
document_declared_encoding: Any | None = ...,
39+
exclude_encodings: Any | None = ...,
40+
) -> None: ...
41+
def test_fragment_to_document(self, fragment): ...
42+
def set_up_substitutions(self, tag): ...
43+
44+
class SAXTreeBuilder(TreeBuilder):
45+
def feed(self, markup) -> None: ...
46+
def close(self) -> None: ...
47+
def startElement(self, name, attrs) -> None: ...
48+
def endElement(self, name) -> None: ...
49+
def startElementNS(self, nsTuple, nodeName, attrs) -> None: ...
50+
def endElementNS(self, nsTuple, nodeName) -> None: ...
51+
def startPrefixMapping(self, prefix, nodeValue) -> None: ...
52+
def endPrefixMapping(self, prefix) -> None: ...
53+
def characters(self, content) -> None: ...
54+
def startDocument(self) -> None: ...
55+
def endDocument(self) -> None: ...
56+
57+
class HTMLTreeBuilder(TreeBuilder):
58+
empty_element_tags: Any
59+
block_elements: Any
60+
DEFAULT_STRING_CONTAINERS: Any
61+
DEFAULT_CDATA_LIST_ATTRIBUTES: Any
62+
DEFAULT_PRESERVE_WHITESPACE_TAGS: Any
63+
def set_up_substitutions(self, tag): ...
64+
65+
class ParserRejectedMarkup(Exception):
66+
def __init__(self, message_or_exception) -> None: ...
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from typing import Any
2+
3+
from bs4.builder import HTMLTreeBuilder
4+
5+
class HTML5TreeBuilder(HTMLTreeBuilder):
6+
NAME: str
7+
features: Any
8+
TRACKS_LINE_NUMBERS: bool
9+
user_specified_encoding: Any
10+
def prepare_markup( # type: ignore # user_specified_encoding doesn't have a default
11+
self, markup, user_specified_encoding, document_declared_encoding: Any | None = ..., exclude_encodings: Any | None = ...
12+
) -> None: ...
13+
def feed(self, markup) -> None: ...
14+
underlying_builder: Any
15+
def create_treebuilder(self, namespaceHTMLElements): ...
16+
def test_fragment_to_document(self, fragment): ...
17+
18+
class TreeBuilderForHtml5lib(Any): # type: ignore # html5lib.treebuilders.base.TreeBuilder
19+
soup: Any
20+
parser: Any
21+
store_line_numbers: Any
22+
def __init__(self, namespaceHTMLElements, soup: Any | None = ..., store_line_numbers: bool = ..., **kwargs) -> None: ...
23+
def documentClass(self): ...
24+
def insertDoctype(self, token) -> None: ...
25+
def elementClass(self, name, namespace): ...
26+
def commentClass(self, data): ...
27+
def fragmentClass(self): ...
28+
def appendChild(self, node) -> None: ...
29+
def getDocument(self): ...
30+
def getFragment(self): ...
31+
def testSerializer(self, element): ...
32+
33+
class AttrList:
34+
element: Any
35+
attrs: Any
36+
def __init__(self, element) -> None: ...
37+
def __iter__(self): ...
38+
def __setitem__(self, name, value) -> None: ...
39+
def items(self): ...
40+
def keys(self): ...
41+
def __len__(self): ...
42+
def __getitem__(self, name): ...
43+
def __contains__(self, name): ...
44+
45+
class Element(Any): # type: ignore # html5lib.treebuilders.base.Node
46+
element: Any
47+
soup: Any
48+
namespace: Any
49+
def __init__(self, element, soup, namespace) -> None: ...
50+
def appendChild(self, node) -> None: ...
51+
def getAttributes(self): ...
52+
def setAttributes(self, attributes) -> None: ...
53+
attributes: Any
54+
def insertText(self, data, insertBefore: Any | None = ...) -> None: ...
55+
def insertBefore(self, node, refNode) -> None: ...
56+
def removeChild(self, node) -> None: ...
57+
def reparentChildren(self, new_parent) -> None: ...
58+
def cloneNode(self): ...
59+
def hasContent(self): ...
60+
def getNameTuple(self): ...
61+
nameTuple: Any
62+
63+
class TextNode(Element):
64+
element: Any
65+
soup: Any
66+
def __init__(self, element, soup) -> None: ...
67+
def cloneNode(self) -> None: ...
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from html.parser import HTMLParser
2+
from typing import Any
3+
4+
from bs4.builder import HTMLTreeBuilder
5+
6+
class HTMLParseError(Exception): ...
7+
8+
class BeautifulSoupHTMLParser(HTMLParser):
9+
IGNORE: str
10+
REPLACE: str
11+
on_duplicate_attribute: Any
12+
already_closed_empty_element: Any
13+
def __init__(self, *args, **kwargs) -> None: ...
14+
def error(self, msg) -> None: ...
15+
def handle_startendtag(self, name, attrs) -> None: ...
16+
def handle_starttag(self, name, attrs, handle_empty_element: bool = ...) -> None: ...
17+
def handle_endtag(self, name, check_already_closed: bool = ...) -> None: ...
18+
def handle_data(self, data) -> None: ...
19+
def handle_charref(self, name) -> None: ...
20+
def handle_entityref(self, name) -> None: ...
21+
def handle_comment(self, data) -> None: ...
22+
def handle_decl(self, data) -> None: ...
23+
def unknown_decl(self, data) -> None: ...
24+
def handle_pi(self, data) -> None: ...
25+
26+
class HTMLParserTreeBuilder(HTMLTreeBuilder):
27+
is_xml: bool
28+
picklable: bool
29+
NAME: Any
30+
features: Any
31+
TRACKS_LINE_NUMBERS: bool
32+
parser_args: Any
33+
def __init__(self, parser_args: Any | None = ..., parser_kwargs: Any | None = ..., **kwargs) -> None: ...
34+
def prepare_markup(
35+
self,
36+
markup,
37+
user_specified_encoding: Any | None = ...,
38+
document_declared_encoding: Any | None = ...,
39+
exclude_encodings: Any | None = ...,
40+
) -> None: ...
41+
def feed(self, markup) -> None: ...
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from typing import Any
2+
3+
from bs4.builder import HTMLTreeBuilder, TreeBuilder
4+
5+
class LXMLTreeBuilderForXML(TreeBuilder):
6+
DEFAULT_PARSER_CLASS: Any
7+
is_xml: bool
8+
processing_instruction_class: Any
9+
NAME: str
10+
ALTERNATE_NAMES: Any
11+
features: Any
12+
CHUNK_SIZE: int
13+
DEFAULT_NSMAPS: Any
14+
DEFAULT_NSMAPS_INVERTED: Any
15+
def initialize_soup(self, soup) -> None: ...
16+
def default_parser(self, encoding): ...
17+
def parser_for(self, encoding): ...
18+
empty_element_tags: Any
19+
soup: Any
20+
nsmaps: Any
21+
def __init__(self, parser: Any | None = ..., empty_element_tags: Any | None = ..., **kwargs) -> None: ...
22+
def prepare_markup( # type: ignore # the order of the parameters is different
23+
self,
24+
markup,
25+
user_specified_encoding: Any | None = ...,
26+
exclude_encodings: Any | None = ...,
27+
document_declared_encoding: Any | None = ...,
28+
) -> None: ...
29+
parser: Any
30+
def feed(self, markup) -> None: ...
31+
def close(self) -> None: ...
32+
def start(self, name, attrs, nsmap=...) -> None: ...
33+
def end(self, name) -> None: ...
34+
def pi(self, target, data) -> None: ...
35+
def data(self, content) -> None: ...
36+
def doctype(self, name, pubid, system) -> None: ...
37+
def comment(self, content) -> None: ...
38+
def test_fragment_to_document(self, fragment): ...
39+
40+
class LXMLTreeBuilder(HTMLTreeBuilder, LXMLTreeBuilderForXML):
41+
NAME: Any
42+
ALTERNATE_NAMES: Any
43+
features: Any
44+
is_xml: bool
45+
processing_instruction_class: Any
46+
def default_parser(self, encoding): ...
47+
parser: Any
48+
def feed(self, markup) -> None: ...
49+
def test_fragment_to_document(self, fragment): ...

stubs/beautifulsoup4/bs4/dammit.pyi

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from typing import Any
2+
3+
chardet_type: Any
4+
5+
def chardet_dammit(s): ...
6+
7+
xml_encoding: str
8+
html_meta: str
9+
encoding_res: Any
10+
11+
class EntitySubstitution:
12+
CHARACTER_TO_HTML_ENTITY: Any
13+
HTML_ENTITY_TO_CHARACTER: Any
14+
CHARACTER_TO_HTML_ENTITY_RE: Any
15+
CHARACTER_TO_XML_ENTITY: Any
16+
BARE_AMPERSAND_OR_BRACKET: Any
17+
AMPERSAND_OR_BRACKET: Any
18+
@classmethod
19+
def quoted_attribute_value(cls, value): ...
20+
@classmethod
21+
def substitute_xml(cls, value, make_quoted_attribute: bool = ...): ...
22+
@classmethod
23+
def substitute_xml_containing_entities(cls, value, make_quoted_attribute: bool = ...): ...
24+
@classmethod
25+
def substitute_html(cls, s): ...
26+
27+
class EncodingDetector:
28+
override_encodings: Any
29+
exclude_encodings: Any
30+
chardet_encoding: Any
31+
is_html: Any
32+
declared_encoding: Any
33+
def __init__(
34+
self, markup, override_encodings: Any | None = ..., is_html: bool = ..., exclude_encodings: Any | None = ...
35+
) -> None: ...
36+
@property
37+
def encodings(self) -> None: ...
38+
@classmethod
39+
def strip_byte_order_mark(cls, data): ...
40+
@classmethod
41+
def find_declared_encoding(cls, markup, is_html: bool = ..., search_entire_document: bool = ...): ...
42+
43+
class UnicodeDammit:
44+
CHARSET_ALIASES: Any
45+
ENCODINGS_WITH_SMART_QUOTES: Any
46+
smart_quotes_to: Any
47+
tried_encodings: Any
48+
contains_replacement_characters: bool
49+
is_html: Any
50+
log: Any
51+
detector: Any
52+
markup: Any
53+
unicode_markup: Any
54+
original_encoding: Any
55+
def __init__(
56+
self, markup, override_encodings=..., smart_quotes_to: Any | None = ..., is_html: bool = ..., exclude_encodings=...
57+
) -> None: ...
58+
@property
59+
def declared_html_encoding(self): ...
60+
def find_codec(self, charset): ...
61+
MS_CHARS: Any
62+
MS_CHARS_TO_ASCII: Any
63+
WINDOWS_1252_TO_UTF8: Any
64+
MULTIBYTE_MARKERS_AND_SIZES: Any
65+
FIRST_MULTIBYTE_MARKER: Any
66+
LAST_MULTIBYTE_MARKER: Any
67+
@classmethod
68+
def detwingle(cls, in_bytes, main_encoding: str = ..., embedded_encoding: str = ...): ...

0 commit comments

Comments
 (0)