Parse the currently loaded website.

        Optionally, SoupStrainer can be used to only parse relevant
        parts of the page. This can be particularly useful if the website is
        complex or perfomance is a factor.
        <https://www.crummy.com/software/BeautifulSoup/bs4/doc/#soupstrainer>

        Args:
            *args: Optional positional arguments that `SoupStrainer` takes.
            **kwargs: Optional keyword argument that `SoupStrainer` takes.

        Returns:
            A `BeautifulSoup` object.

        Raises:
            NoWebsiteLoadedError: If no website is currently loaded.
            ParsingError: If the current response isn't supported by `bs4`

def soup(self, *args, **kwargs):
        """Parse the currently loaded website.

        Optionally, SoupStrainer can be used to only parse relevant
        parts of the page. This can be particularly useful if the website is
        complex or perfomance is a factor.
        <https://www.crummy.com/software/BeautifulSoup/bs4/doc/#soupstrainer>

        Args:
            *args: Optional positional arguments that `SoupStrainer` takes.
            **kwargs: Optional keyword argument that `SoupStrainer` takes.

        Returns:
            A `BeautifulSoup` object.

        Raises:
            NoWebsiteLoadedError: If no website is currently loaded.
            ParsingError: If the current response isn't supported by `bs4`
        """
        if self._url is None:
            raise NoWebsiteLoadedError('website parsing requires a loaded website')

        content_type = self._response.headers.get('Content-Type', '')
        if not any(markup in content_type for markup in ('html', 'xml')):
            raise ParsingError('unsupported content type \'{}\''.format(content_type))

        strainer = SoupStrainer(*args, **kwargs)
        return BeautifulSoup(self._response.content, self.parser, parse_only=strainer)