diff --git a/docs/src/markdown/about/changelog.md b/docs/src/markdown/about/changelog.md
index 8314f45..0c1b135 100644
--- a/docs/src/markdown/about/changelog.md
+++ b/docs/src/markdown/about/changelog.md
@@ -4,6 +4,8 @@
 
 - **NEW**: Allow `:contans()` to accept a list of text to search for. (#115)
 - **NEW**: Add new `escape` function for escaping CSS identifiers. (#125)
+- **NEW**: Deprecate `comments` and `icomments` in the API to ensure Soup Sieve focuses only on CSS selectors.
+`comments` and `icomments` will most likely be removed in 2.0. (#130)
 - **FIX**: Don't install test files when installing the `soupsieve` package. (#111)
 - **FIX**: Improve efficiency of `:contains()` comparison.
 - **FIX**: Null characters should translate to the Unicode REPLACEMENT CHARACTER (`U+FFFD`) according to the
diff --git a/docs/src/markdown/api.md b/docs/src/markdown/api.md
index 83e3bbf..d400b08 100644
--- a/docs/src/markdown/api.md
+++ b/docs/src/markdown/api.md
@@ -151,6 +151,9 @@ from the given tag down through all of its children.  You can limit how many com
 
 `comments` accepts a `Tag`/`BeautifulSoup` object, a `limit`, and flags.
 
+!!! warning "Deprecated in 1.9.0"
+    `comments` is deprecated so Soup Sieve can focus on only CSS selectors. `comments` will be removed in version 2.0.
+
 ## `soupsieve.icomments()`
 
 ```py3
@@ -160,6 +163,9 @@ def icomments(node, limit=0, flags=0, **kwargs):
 
 `icomments` is exactly like `comments` except that it returns a generator instead of a list.
 
+!!! warning "Deprecated in 1.9.0"
+    `icomments` is deprecated so Soup Sieve can focus on only CSS selectors. `comments` will be removed in version 2.0.
+
 ## `soupsieve.escape()`
 
 ```py3
@@ -182,6 +188,9 @@ would normally cause an identifier to be invalid.
 '�'
 ```
 
+!!! new "New in 1.9.0"
+    `escape` is a new API function added in 1.9.0.
+
 ## `soupsieve.compile()`
 
 ```py3
diff --git a/soupsieve/__init__.py b/soupsieve/__init__.py
index 16c501b..49c478f 100644
--- a/soupsieve/__init__.py
+++ b/soupsieve/__init__.py
@@ -30,7 +30,7 @@ from .__meta__ import __version__, __version_info__  # noqa: F401
 from . import css_parser as cp
 from . import css_match as cm
 from . import css_types as ct
-from .util import DEBUG, _QUIRKS, SelectorSyntaxError  # noqa: F401
+from .util import DEBUG, _QUIRKS, deprecated, SelectorSyntaxError  # noqa: F401
 
 __all__ = (
     'DEBUG', "_QUIRKS", 'SelectorSyntaxError', 'SoupSieve',
@@ -87,12 +87,14 @@ def filter(select, iterable, namespaces=None, flags=0, **kwargs):  # noqa: A001
     return compile(select, namespaces, flags, **kwargs).filter(iterable)
 
 
+@deprecated("'comments' is not related to CSS selectors and will be removed in the future.")
 def comments(tag, limit=0, flags=0, **kwargs):
     """Get comments only."""
 
-    return list(icomments(tag, limit, flags))
+    return [comment for comment in cm.CommentsMatch(tag).get_comments(limit)]
 
 
+@deprecated("'icomments' is not related to CSS selectors and will be removed in the future.")
 def icomments(tag, limit=0, flags=0, **kwargs):
     """Iterate comments only."""
 
diff --git a/soupsieve/css_match.py b/soupsieve/css_match.py
index 923eb84..fb936ae 100644
--- a/soupsieve/css_match.py
+++ b/soupsieve/css_match.py
@@ -1297,11 +1297,13 @@ class SoupSieve(ct.Immutable):
         else:
             return [node for node in iterable if not CSSMatch.is_navigable_string(node) and self.match(node)]
 
+    @util.deprecated("'comments' is not related to CSS selectors and will be removed in the future.")
     def comments(self, tag, limit=0):
         """Get comments only."""
 
-        return list(self.icomments(tag, limit))
+        return [comment for comment in CommentsMatch(tag).get_comments(limit)]
 
+    @util.deprecated("'icomments' is not related to CSS selectors and will be removed in the future.")
     def icomments(self, tag, limit=0):
         """Iterate comments only."""
 

Deprecate comments and icomments
Soup Sieve is a CSS selector library, and comment extraction is actually out of scope. It isn't hard to extract comments manually either. I think moving forward it is better to cut out unrelated bloat and focus on our main priority, CSS selectors.
diff --git a/tests/test_api.py b/tests/test_api.py
index baf2d83..c37543b 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -708,6 +708,68 @@ class TestInvalidQuirks(TestInvalid):
             self.assertTrue(issubclass(w[-1].category, sv_util.QuirksWarning))
 
 
+class TestDeprecated(util.TestCase):
+    """Test deprecated."""
+
+    def test_comment(self):
+        """Test comment."""
+
+        html = '<div><!-- comments -->text</div>'
+        soup = self.soup(html, 'html.parser')
+
+        with warnings.catch_warnings(record=True) as w:
+            # Cause all warnings to always be triggered.
+            warnings.simplefilter("always")
+
+            sv.comments(soup)
+            self.assertTrue(len(w) == 1)
+            self.assertTrue(issubclass(w[-1].category, DeprecationWarning))
+
+    def test_comment_compilied(self):
+        """Test compiled comment."""
+
+        html = '<div><!-- comments -->text</div>'
+        soup = self.soup(html, 'html.parser')
+
+        with warnings.catch_warnings(record=True) as w:
+            # Cause all warnings to always be triggered.
+            warnings.simplefilter("always")
+
+            pattern = sv.compile('div')
+            pattern.comments(soup)
+            self.assertTrue(len(w) == 1)
+            self.assertTrue(issubclass(w[-1].category, DeprecationWarning))
+
+    def test_icomment(self):
+        """Test `icomment`."""
+
+        html = '<div><!-- comments -->text</div>'
+        soup = self.soup(html, 'html.parser')
+
+        with warnings.catch_warnings(record=True) as w:
+            # Cause all warnings to always be triggered.
+            warnings.simplefilter("always")
+
+            sv.icomments(soup)
+            self.assertTrue(len(w) == 1)
+            self.assertTrue(issubclass(w[-1].category, DeprecationWarning))
+
+    def test_icomment_compilied(self):
+        """Test compiled `icomment`."""
+
+        html = '<div><!-- comments -->text</div>'
+        soup = self.soup(html, 'html.parser')
+
+        with warnings.catch_warnings(record=True) as w:
+            # Cause all warnings to always be triggered.
+            warnings.simplefilter("always")
+
+            pattern = sv.compile('div')
+            pattern.icomments(soup)
+            self.assertTrue(len(w) == 1)
+            self.assertTrue(issubclass(w[-1].category, DeprecationWarning))
+
+
 class TestSyntaxErrorReporting(util.TestCase):
     """Test reporting of syntax errors."""
 

pip install -e .
parse_log_pytest
requirements.txt
pytest pytest-cov coverage lxml html5lib mypy
apt-get update apt-get install -y gcc
3.9
requirements/project.txt requirements/tests.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
beautifulsoup4==4.13.3
coverage==7.8.0
exceptiongroup==1.2.2
html5lib==1.1
iniconfig==2.1.0
lxml==5.3.1
mypy==1.15.0
mypy-extensions==1.0.0
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
pytest-cov==6.0.0
six==1.17.0
-e git+https://github.com/facelessuser/soupsieve.git@7cd8fcd2040b64a26a2b77df6eece1996b8c959a#egg=soupsieve
tomli==2.2.1
typing_extensions==4.13.0
webencodings==0.5.1

name: soupsieve
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - beautifulsoup4==4.13.3
      - coverage==7.8.0
      - exceptiongroup==1.2.2
      - html5lib==1.1
      - iniconfig==2.1.0
      - lxml==5.3.1
      - mypy==1.15.0
      - mypy-extensions==1.0.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - six==1.17.0
      - tomli==2.2.1
      - typing-extensions==4.13.0
      - webencodings==0.5.1
prefix: /opt/conda/envs/soupsieve

tests/test_api.py::TestDeprecated::test_comment tests/test_api.py::TestDeprecated::test_comment_compilied tests/test_api.py::TestDeprecated::test_icomment tests/test_api.py::TestDeprecated::test_icomment_compilied
tests/test_api.py::TestSoupSieve::test_cache tests/test_api.py::TestSoupSieve::test_closest_match_complex_parent tests/test_api.py::TestSoupSieve::test_closest_match_parent tests/test_api.py::TestSoupSieve::test_closest_match_self tests/test_api.py::TestSoupSieve::test_closest_must_be_parent tests/test_api.py::TestSoupSieve::test_comments tests/test_api.py::TestSoupSieve::test_compiled_comments tests/test_api.py::TestSoupSieve::test_compiled_icomments tests/test_api.py::TestSoupSieve::test_copy_pickle tests/test_api.py::TestSoupSieve::test_escape_ctrl tests/test_api.py::TestSoupSieve::test_escape_hyphen tests/test_api.py::TestSoupSieve::test_escape_null tests/test_api.py::TestSoupSieve::test_escape_numbers tests/test_api.py::TestSoupSieve::test_escape_special tests/test_api.py::TestSoupSieve::test_escape_wide_unicode tests/test_api.py::TestSoupSieve::test_filter_list tests/test_api.py::TestSoupSieve::test_filter_tag tests/test_api.py::TestSoupSieve::test_icomments tests/test_api.py::TestSoupSieve::test_immutable_dict_size tests/test_api.py::TestSoupSieve::test_iselect tests/test_api.py::TestSoupSieve::test_match tests/test_api.py::TestSoupSieve::test_recompile tests/test_api.py::TestSoupSieve::test_select tests/test_api.py::TestSoupSieve::test_select_limit tests/test_api.py::TestSoupSieve::test_select_one tests/test_api.py::TestSoupSieve::test_select_one_none tests/test_api.py::TestSoupSieve::test_select_order tests/test_api.py::TestInvalid::test_immutable_dict_hashable_key tests/test_api.py::TestInvalid::test_immutable_dict_hashable_value tests/test_api.py::TestInvalid::test_immutable_dict_read_only tests/test_api.py::TestInvalid::test_immutable_object tests/test_api.py::TestInvalid::test_invalid_custom_hashable_key tests/test_api.py::TestInvalid::test_invalid_custom_hashable_value tests/test_api.py::TestInvalid::test_invalid_custom_type tests/test_api.py::TestInvalid::test_invalid_namespace_hashable_key tests/test_api.py::TestInvalid::test_invalid_namespace_hashable_value tests/test_api.py::TestInvalid::test_invalid_namespace_type tests/test_api.py::TestInvalid::test_invalid_type_input_comments tests/test_api.py::TestInvalid::test_invalid_type_input_filter tests/test_api.py::TestInvalid::test_invalid_type_input_match tests/test_api.py::TestInvalid::test_invalid_type_input_select tests/test_api.py::TestInvalidQuirks::test_immutable_dict_hashable_key tests/test_api.py::TestInvalidQuirks::test_immutable_dict_hashable_value tests/test_api.py::TestInvalidQuirks::test_immutable_dict_read_only tests/test_api.py::TestInvalidQuirks::test_immutable_object tests/test_api.py::TestInvalidQuirks::test_invalid_custom_hashable_key tests/test_api.py::TestInvalidQuirks::test_invalid_custom_hashable_value tests/test_api.py::TestInvalidQuirks::test_invalid_custom_type tests/test_api.py::TestInvalidQuirks::test_invalid_namespace_hashable_key tests/test_api.py::TestInvalidQuirks::test_invalid_namespace_hashable_value tests/test_api.py::TestInvalidQuirks::test_invalid_namespace_type tests/test_api.py::TestInvalidQuirks::test_invalid_type_input_comments tests/test_api.py::TestInvalidQuirks::test_invalid_type_input_filter tests/test_api.py::TestInvalidQuirks::test_invalid_type_input_match tests/test_api.py::TestInvalidQuirks::test_invalid_type_input_select tests/test_api.py::TestInvalidQuirks::test_quirks_warn_attribute_unquoted tests/test_api.py::TestInvalidQuirks::test_quirks_warn_relative_combinator tests/test_api.py::TestSyntaxErrorReporting::test_simple_syntax_error tests/test_api.py::TestSyntaxErrorReporting::test_syntax_error_has_text_and_position tests/test_api.py::TestSyntaxErrorReporting::test_syntax_error_on_third_line tests/test_api.py::TestSyntaxErrorReporting::test_syntax_error_with_multiple_lines
soupsieve/css_match.py soupsieve/__init__.py docs/src/markdown/api.md docs/src/markdown/about/changelog.md
soupsieve/css_match.py soupsieve/__init__.py docs/src/markdown/api.md docs/src/markdown/about/changelog.md