diff options
Diffstat (limited to 'bs4/element.py')
-rw-r--r-- | bs4/element.py | 233 |
1 files changed, 3 insertions, 230 deletions
diff --git a/bs4/element.py b/bs4/element.py index a96593c..619fb73 100644 --- a/bs4/element.py +++ b/bs4/element.py @@ -8,14 +8,8 @@ except ImportError as e: import re import sys import warnings -try: - import soupsieve -except ImportError as e: - soupsieve = None - warnings.warn( - 'The soupsieve package is not installed. CSS selectors cannot be used.' - ) +from bs4.css import CSS from bs4.formatter import ( Formatter, HTMLFormatter, @@ -1948,7 +1942,7 @@ class Tag(PageElement): Beautiful Soup will use the prefixes it encountered while parsing the document. - :param kwargs: Keyword arguments to be passed into SoupSieve's + :param kwargs: Keyword arguments to be passed into Soup Sieve's soupsieve.select() method. :return: A Tag. @@ -1981,7 +1975,7 @@ class Tag(PageElement): @property def css(self): """Return an interface to the CSS selector API.""" - return SoupSieveProxy(self) + return CSS(self) # Old names for backwards compatibility def childGenerator(self): @@ -2296,224 +2290,3 @@ class ResultSet(list): raise AttributeError( "ResultSet object has no attribute '%s'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?" % key ) - -class SoupSieveProxy(object): - """A proxy object against the soupsieve library, to simplify its - CSS selector API. - - Specifically, the element to be selected against doesn't need to - be explicitly specified in the function call, since you access - this object through a specific tag. - """ - - def __init__(self, tag): - """Constructor. - - You don't need to instantiate this class yourself; instead, - access the .css attribute on the Tag you want to use as the - starting point for your CSS selector, or on the BeautifulSoup - object itself. - - :param tag: All CSS selectors will use this as their starting - point. - """ - if soupsieve is None: - raise NotImplementedError( - "Cannot execute CSS selectors because the soupsieve package is not installed." - ) - self.tag = tag - - def _ns(self, ns): - """Normalize a dictionary of namespaces.""" - if ns is None: - ns = self.tag._namespaces - return ns - - def _rs(self, results): - """Normalize a list of results to a Resultset. - - A ResultSet is more consistent with the rest of Beautiful - Soup, and ResultSet.__getattr__ has a helpful error message if - you try to treat a list of results as a single result (a - common mistake). - """ - return ResultSet(None, results) - - def select_one(self, select, namespaces=None, flags=0, **kwargs): - """Perform a CSS selection operation on the current Tag and return the - first result. - - This uses the Soup Sieve library. For more information, see - that library's documentation for the soupsieve.select_one() - method. - - :param selector: A CSS selector. - - :param namespaces: A dictionary mapping namespace prefixes - used in the CSS selector to namespace URIs. By default, - Beautiful Soup will use the prefixes it encountered while - parsing the document. - - :param flags: Flags to be passed into Soup Sieve's - soupsieve.select_one() method. - - :param kwargs: Keyword arguments to be passed into SoupSieve's - soupsieve.select_one() method. - - :return: A Tag, or None if the selector has no match. - :rtype: bs4.element.Tag - - """ - return soupsieve.select_one( - select, self.tag, self._ns(namespaces), flags, **kwargs - ) - - def select(self, select, namespaces=None, limit=0, flags=0, **kwargs): - """Perform a CSS selection operation on the current Tag. - - This uses the Soup Sieve library. For more information, see - that library's documentation for the soupsieve.select() - method. - - :param selector: A string containing a CSS selector. - - :param namespaces: A dictionary mapping namespace prefixes - used in the CSS selector to namespace URIs. By default, - Beautiful Soup will pass in the prefixes it encountered while - parsing the document. - - :param limit: After finding this number of results, stop looking. - - :param flags: Flags to be passed into Soup Sieve's - soupsieve.select() method. - - :param kwargs: Keyword arguments to be passed into SoupSieve's - soupsieve.select() method. - - :return: A ResultSet of Tag objects. - :rtype: bs4.element.ResultSet - - """ - if limit is None: - limit = 0 - - return self._rs( - soupsieve.select( - select, self.tag, self._ns(namespaces), limit, flags, - **kwargs - ) - ) - - def iselect(self, select, namespaces=None, limit=0, flags=0, **kwargs): - """Perform a CSS selection operation on the current Tag. - - This uses the Soup Sieve library. For more information, see - that library's documentation for the soupsieve.iselect() - method. It is the same as select(), but it returns a generator - instead of a list. - - :param selector: A string containing a CSS selector. - - :param namespaces: A dictionary mapping namespace prefixes - used in the CSS selector to namespace URIs. By default, - Beautiful Soup will pass in the prefixes it encountered while - parsing the document. - - :param limit: After finding this number of results, stop looking. - - :param flags: Flags to be passed into Soup Sieve's - soupsieve.iselect() method. - - :param kwargs: Keyword arguments to be passed into SoupSieve's - soupsieve.iselect() method. - - :return: A generator - :rtype: types.GeneratorType - """ - return soupsieve.iselect( - select, self.tag, self._ns(namespaces), limit, flags, **kwargs - ) - - def closest(self, select, namespaces=None, flags=0, **kwargs): - """Find the Tag closest to this one that matches the given selector. - - This uses the Soup Sieve library. For more information, see - that library's documentation for the soupsieve.closest() - method. - - :param selector: A string containing a CSS selector. - - :param namespaces: A dictionary mapping namespace prefixes - used in the CSS selector to namespace URIs. By default, - Beautiful Soup will pass in the prefixes it encountered while - parsing the document. - - :param flags: Flags to be passed into Soup Sieve's - soupsieve.closest() method. - - :param kwargs: Keyword arguments to be passed into SoupSieve's - soupsieve.closest() method. - - :return: A Tag, or None if there is no match. - :rtype: bs4.Tag - - """ - return soupsieve.closest( - select, self.tag, self._ns(namespaces), flags, **kwargs - ) - - def match(self, select, namespaces=None, flags=0, **kwargs): - """Check whether this Tag matches the given CSS selector. - - This uses the Soup Sieve library. For more information, see - that library's documentation for the soupsieve.match() - method. - - :param: a CSS selector. - - :param namespaces: A dictionary mapping namespace prefixes - used in the CSS selector to namespace URIs. By default, - Beautiful Soup will pass in the prefixes it encountered while - parsing the document. - - :param flags: Flags to be passed into Soup Sieve's - soupsieve.match() method. - - :param kwargs: Keyword arguments to be passed into SoupSieve's - soupsieve.match() method. - - :return: True if this Tag matches the selector; False otherwise. - :rtype: bool - """ - return soupsieve.match( - select, self.tag, self._ns(namespaces), flags, **kwargs - ) - - def filter(self, select, namespaces=None, flags=0, **kwargs): - """Filter this Tag's direct children based on the given CSS selector. - - This uses the Soup Sieve library. It works the same way as - passing this Tag into that library's soupsieve.filter() - method. More information, for more information see the - documentation for soupsieve.filter(). - - :param namespaces: A dictionary mapping namespace prefixes - used in the CSS selector to namespace URIs. By default, - Beautiful Soup will pass in the prefixes it encountered while - parsing the document. - - :param flags: Flags to be passed into Soup Sieve's - soupsieve.filter() method. - - :param kwargs: Keyword arguments to be passed into SoupSieve's - soupsieve.filter() method. - - :return: A ResultSet of Tag objects. - :rtype: bs4.element.ResultSet - - """ - return self._rs( - soupsieve.filter( - select, self.tag, self._ns(namespaces), flags, **kwargs - ) - ) |