summaryrefslogtreecommitdiff
path: root/bs4/element.py
diff options
context:
space:
mode:
Diffstat (limited to 'bs4/element.py')
-rw-r--r--bs4/element.py233
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
- )
- )