diff --git a/scrapy/http/response/text.py b/scrapy/http/response/text.py
index 33a485328..2f0f3820c 100644
--- a/scrapy/http/response/text.py
+++ b/scrapy/http/response/text.py
@@ -188,9 +188,11 @@ class TextResponse(Response):
         selectors from which links cannot be obtained (for instance, anchor tags without an
         ``href`` attribute)
         """
-        arg_count = len(list(filter(None, (urls, css, xpath))))
-        if arg_count != 1:
-            raise ValueError('Please supply exactly one of the following arguments: urls, css, xpath')
+        arguments = [x for x in (urls, css, xpath) if x is not None]
+        if len(arguments) != 1:
+            raise ValueError(
+                "Please supply exactly one of the following arguments: urls, css, xpath"
+            )
         if not urls:
             if css:
                 urls = self.css(css)

follow_all fails with an empty list of URLs
<!--

Thanks for taking an interest in Scrapy!

If you have a question that starts with "How to...", please see the Scrapy Community page: https://scrapy.org/community/.
The GitHub issue tracker's purpose is to deal with bug reports and feature requests for the project itself.

Keep in mind that by filing an issue, you are expected to comply with Scrapy's Code of Conduct, including treating everyone with respect: https://github.com/scrapy/scrapy/blob/master/CODE_OF_CONDUCT.md

The following is a suggested template to structure your issue, you can find more guidelines at https://doc.scrapy.org/en/latest/contributing.html#reporting-bugs

-->

### Description

`follow_all` with an empty list of urls fails with `ValueError('Please supply exactly one of the following arguments: urls, css, xpath')`

What I would expect instead is just an empty generator of requests. 

### Steps to Reproduce

```py
class Spider(scrapy.Spider):

    def parse(self, response):
        yield from response.follow_all([], self.parse)
```

**Expected behavior:** 

No error is raised

**Actual behavior:**

`ValueError('Please supply exactly one of the following arguments: urls, css, xpath')` exception is raised. 


### Versions

2.0

### Additional context

I think the solution is just a matter of changing this line: https://github.com/scrapy/scrapy/blob/master/scrapy/http/response/text.py#L191

diff --git a/tests/test_http_response.py b/tests/test_http_response.py
index be17dfd6b..eafc3560e 100644
--- a/tests/test_http_response.py
+++ b/tests/test_http_response.py
@@ -215,6 +215,10 @@ class BaseResponseTest(unittest.TestCase):
         links = map(Link, absolute)
         self._assert_followed_all_urls(links, absolute)
 
+    def test_follow_all_empty(self):
+        r = self.response_class("http://example.com")
+        self.assertEqual([], list(r.follow_all([])))
+
     def test_follow_all_invalid(self):
         r = self.response_class("http://example.com")
         if self.response_class == Response:

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-flake8 bandit
apt-get update apt-get install -y python3-dev libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
3.8
tests/requirements-py3.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
asgiref==3.5.2
asttokens==3.0.0
attrs==25.3.0
Automat==24.8.1
backcall==0.2.0
bandit==1.7.10
blessed==1.20.0
blinker==1.4
bpython==0.24
Brotli==1.0.9
brotlipy==0.7.0
certifi==2025.1.31
cffi==1.17.1
charset-normalizer==3.4.1
click==8.1.8
constantly==23.10.4
coverage==7.6.1
cryptography==36.0.2
cssselect==1.2.0
curtsies==0.4.2
cwcwidth==0.1.9
decorator==5.2.1
exceptiongroup==1.2.2
execnet==2.1.1
executing==2.2.0
flake8==5.0.4
Flask==2.0.3
greenlet==3.1.1
h11==0.13.0
h2==4.1.0
hpack==4.0.0
hyperframe==6.0.1
hyperlink==21.0.0
idna==3.10
incremental==24.7.2
iniconfig==2.1.0
ipython==8.12.3
itsdangerous==2.2.0
jedi==0.19.2
Jinja2==3.1.6
jmespath==1.0.1
kaitaistruct==0.9
ldap3==2.9.1
lxml==5.3.1
markdown-it-py==3.0.0
MarkupSafe==2.1.5
matplotlib-inline==0.1.7
mccabe==0.7.0
mdurl==0.1.2
mitmproxy==8.0.0
msgpack==1.0.8
packaging==24.2
parsel==1.9.1
parso==0.8.4
passlib==1.7.4
pbr==6.1.1
pexpect==4.9.0
pickleshare==0.7.5
pluggy==1.5.0
prompt_toolkit==3.0.50
Protego==0.3.1
protobuf==3.19.6
ptyprocess==0.7.0
publicsuffix2==2.20191221
pure_eval==0.2.3
pyasn1==0.6.1
pyasn1_modules==0.4.2
pycodestyle==2.9.1
pycparser==2.22
PyDispatcher==2.0.7
pyflakes==2.5.0
Pygments==2.19.1
pyOpenSSL==22.0.0
pyparsing==3.0.9
pyperclip==1.8.2
pytest==8.3.5
pytest-cov==5.0.0
pytest-flake8==1.2.2
pytest-twisted==1.14.3
pytest-xdist==3.6.1
pyxdg==0.28
PyYAML==6.0.2
queuelib==1.7.0
requests==2.32.3
rich==14.0.0
ruamel.yaml==0.17.40
ruamel.yaml.clib==0.2.8
-e git+https://github.com/scrapy/scrapy.git@388f23c30cf20d35433a44d1a60d410dc660c00a#egg=Scrapy
service-identity==24.2.0
six==1.17.0
sortedcontainers==2.4.0
stack-data==0.6.3
stevedore==5.3.0
sybil==7.1.1
testfixtures==8.3.0
tomli==2.2.1
tornado==6.4.2
traitlets==5.14.3
Twisted==24.11.0
typing_extensions==4.13.0
urllib3==2.2.3
urwid==2.1.2
w3lib==2.2.1
wcwidth==0.2.13
Werkzeug==3.0.6
wsproto==1.1.0
zope.interface==7.2
zstandard==0.17.0

name: scrapy
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=24.2=py38h06a4308_0
  - python=3.8.20=he870216_0
  - readline=8.2=h5eee18b_0
  - setuptools=75.1.0=py38h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.44.0=py38h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - asgiref==3.5.2
      - asttokens==3.0.0
      - attrs==25.3.0
      - automat==24.8.1
      - backcall==0.2.0
      - bandit==1.7.10
      - blessed==1.20.0
      - blinker==1.4
      - bpython==0.24
      - brotli==1.0.9
      - brotlipy==0.7.0
      - certifi==2025.1.31
      - cffi==1.17.1
      - charset-normalizer==3.4.1
      - click==8.1.8
      - constantly==23.10.4
      - coverage==7.6.1
      - cryptography==36.0.2
      - cssselect==1.2.0
      - curtsies==0.4.2
      - cwcwidth==0.1.9
      - decorator==5.2.1
      - exceptiongroup==1.2.2
      - execnet==2.1.1
      - executing==2.2.0
      - flake8==5.0.4
      - flask==2.0.3
      - greenlet==3.1.1
      - h11==0.13.0
      - h2==4.1.0
      - hpack==4.0.0
      - hyperframe==6.0.1
      - hyperlink==21.0.0
      - idna==3.10
      - incremental==24.7.2
      - iniconfig==2.1.0
      - ipython==8.12.3
      - itsdangerous==2.2.0
      - jedi==0.19.2
      - jinja2==3.1.6
      - jmespath==1.0.1
      - kaitaistruct==0.9
      - ldap3==2.9.1
      - lxml==5.3.1
      - markdown-it-py==3.0.0
      - markupsafe==2.1.5
      - matplotlib-inline==0.1.7
      - mccabe==0.7.0
      - mdurl==0.1.2
      - mitmproxy==8.0.0
      - msgpack==1.0.8
      - packaging==24.2
      - parsel==1.9.1
      - parso==0.8.4
      - passlib==1.7.4
      - pbr==6.1.1
      - pexpect==4.9.0
      - pickleshare==0.7.5
      - pluggy==1.5.0
      - prompt-toolkit==3.0.50
      - protego==0.3.1
      - protobuf==3.19.6
      - ptyprocess==0.7.0
      - publicsuffix2==2.20191221
      - pure-eval==0.2.3
      - pyasn1==0.6.1
      - pyasn1-modules==0.4.2
      - pycodestyle==2.9.1
      - pycparser==2.22
      - pydispatcher==2.0.7
      - pyflakes==2.5.0
      - pygments==2.19.1
      - pyopenssl==22.0.0
      - pyparsing==3.0.9
      - pyperclip==1.8.2
      - pytest==8.3.5
      - pytest-cov==5.0.0
      - pytest-flake8==1.2.2
      - pytest-twisted==1.14.3
      - pytest-xdist==3.6.1
      - pyxdg==0.28
      - pyyaml==6.0.2
      - queuelib==1.7.0
      - requests==2.32.3
      - rich==14.0.0
      - ruamel-yaml==0.17.40
      - ruamel-yaml-clib==0.2.8
      - service-identity==24.2.0
      - six==1.17.0
      - sortedcontainers==2.4.0
      - stack-data==0.6.3
      - stevedore==5.3.0
      - sybil==7.1.1
      - testfixtures==8.3.0
      - tomli==2.2.1
      - tornado==6.4.2
      - traitlets==5.14.3
      - twisted==24.11.0
      - typing-extensions==4.13.0
      - urllib3==2.2.3
      - urwid==2.1.2
      - w3lib==2.2.1
      - wcwidth==0.2.13
      - werkzeug==3.0.6
      - wsproto==1.1.0
      - zope-interface==7.2
      - zstandard==0.17.0
prefix: /opt/conda/envs/scrapy

tests/test_http_response.py::TextResponseTest::test_follow_all_empty tests/test_http_response.py::HtmlResponseTest::test_follow_all_empty tests/test_http_response.py::XmlResponseTest::test_follow_all_empty
tests/test_http_response.py::BaseResponseTest::test_follow_whitespace_link tests/test_http_response.py::BaseResponseTest::test_follow_whitespace_url tests/test_http_response.py::TextResponseTest::test_follow_all_css tests/test_http_response.py::TextResponseTest::test_follow_all_css_skip_invalid tests/test_http_response.py::TextResponseTest::test_follow_all_xpath tests/test_http_response.py::TextResponseTest::test_follow_all_xpath_skip_invalid tests/test_http_response.py::TextResponseTest::test_follow_encoding tests/test_http_response.py::TextResponseTest::test_follow_selector tests/test_http_response.py::TextResponseTest::test_follow_selector_attribute tests/test_http_response.py::TextResponseTest::test_follow_selector_invalid tests/test_http_response.py::TextResponseTest::test_follow_selector_list tests/test_http_response.py::TextResponseTest::test_follow_selector_no_href tests/test_http_response.py::TextResponseTest::test_follow_whitespace_link tests/test_http_response.py::TextResponseTest::test_follow_whitespace_selector tests/test_http_response.py::TextResponseTest::test_follow_whitespace_url tests/test_http_response.py::TextResponseTest::test_selector tests/test_http_response.py::TextResponseTest::test_selector_shortcuts tests/test_http_response.py::TextResponseTest::test_selector_shortcuts_kwargs tests/test_http_response.py::TextResponseTest::test_shortcut_attributes tests/test_http_response.py::HtmlResponseTest::test_follow_all_css tests/test_http_response.py::HtmlResponseTest::test_follow_all_css_skip_invalid tests/test_http_response.py::HtmlResponseTest::test_follow_all_xpath tests/test_http_response.py::HtmlResponseTest::test_follow_all_xpath_skip_invalid tests/test_http_response.py::HtmlResponseTest::test_follow_encoding tests/test_http_response.py::HtmlResponseTest::test_follow_selector tests/test_http_response.py::HtmlResponseTest::test_follow_selector_attribute tests/test_http_response.py::HtmlResponseTest::test_follow_selector_invalid tests/test_http_response.py::HtmlResponseTest::test_follow_selector_list tests/test_http_response.py::HtmlResponseTest::test_follow_selector_no_href tests/test_http_response.py::HtmlResponseTest::test_follow_whitespace_link tests/test_http_response.py::HtmlResponseTest::test_follow_whitespace_selector tests/test_http_response.py::HtmlResponseTest::test_follow_whitespace_url tests/test_http_response.py::HtmlResponseTest::test_selector tests/test_http_response.py::HtmlResponseTest::test_selector_shortcuts tests/test_http_response.py::HtmlResponseTest::test_selector_shortcuts_kwargs tests/test_http_response.py::HtmlResponseTest::test_shortcut_attributes tests/test_http_response.py::XmlResponseTest::test_follow_all_css tests/test_http_response.py::XmlResponseTest::test_follow_all_css_skip_invalid tests/test_http_response.py::XmlResponseTest::test_follow_all_xpath tests/test_http_response.py::XmlResponseTest::test_follow_all_xpath_skip_invalid tests/test_http_response.py::XmlResponseTest::test_follow_encoding tests/test_http_response.py::XmlResponseTest::test_follow_selector tests/test_http_response.py::XmlResponseTest::test_follow_selector_attribute tests/test_http_response.py::XmlResponseTest::test_follow_selector_invalid tests/test_http_response.py::XmlResponseTest::test_follow_selector_list tests/test_http_response.py::XmlResponseTest::test_follow_selector_no_href tests/test_http_response.py::XmlResponseTest::test_follow_whitespace_link tests/test_http_response.py::XmlResponseTest::test_follow_whitespace_selector tests/test_http_response.py::XmlResponseTest::test_follow_whitespace_url tests/test_http_response.py::XmlResponseTest::test_selector tests/test_http_response.py::XmlResponseTest::test_selector_shortcuts tests/test_http_response.py::XmlResponseTest::test_selector_shortcuts_kwargs tests/test_http_response.py::XmlResponseTest::test_shortcut_attributes
tests/test_http_response.py::BaseResponseTest::test_copy tests/test_http_response.py::BaseResponseTest::test_copy_cb_kwargs tests/test_http_response.py::BaseResponseTest::test_copy_inherited_classes tests/test_http_response.py::BaseResponseTest::test_copy_meta tests/test_http_response.py::BaseResponseTest::test_follow_None_url tests/test_http_response.py::BaseResponseTest::test_follow_all_absolute tests/test_http_response.py::BaseResponseTest::test_follow_all_empty tests/test_http_response.py::BaseResponseTest::test_follow_all_flags tests/test_http_response.py::BaseResponseTest::test_follow_all_invalid tests/test_http_response.py::BaseResponseTest::test_follow_all_links tests/test_http_response.py::BaseResponseTest::test_follow_all_relative tests/test_http_response.py::BaseResponseTest::test_follow_all_whitespace tests/test_http_response.py::BaseResponseTest::test_follow_all_whitespace_links tests/test_http_response.py::BaseResponseTest::test_follow_flags tests/test_http_response.py::BaseResponseTest::test_follow_link tests/test_http_response.py::BaseResponseTest::test_follow_url_absolute tests/test_http_response.py::BaseResponseTest::test_follow_url_relative tests/test_http_response.py::BaseResponseTest::test_immutable_attributes tests/test_http_response.py::BaseResponseTest::test_init tests/test_http_response.py::BaseResponseTest::test_replace tests/test_http_response.py::BaseResponseTest::test_shortcut_attributes tests/test_http_response.py::BaseResponseTest::test_unavailable_cb_kwargs tests/test_http_response.py::BaseResponseTest::test_unavailable_meta tests/test_http_response.py::BaseResponseTest::test_urljoin tests/test_http_response.py::TextResponseTest::test_bom_is_removed_from_body tests/test_http_response.py::TextResponseTest::test_copy tests/test_http_response.py::TextResponseTest::test_copy_cb_kwargs tests/test_http_response.py::TextResponseTest::test_copy_inherited_classes tests/test_http_response.py::TextResponseTest::test_copy_meta tests/test_http_response.py::TextResponseTest::test_declared_encoding_invalid tests/test_http_response.py::TextResponseTest::test_encoding tests/test_http_response.py::TextResponseTest::test_follow_None_url tests/test_http_response.py::TextResponseTest::test_follow_all_absolute tests/test_http_response.py::TextResponseTest::test_follow_all_flags tests/test_http_response.py::TextResponseTest::test_follow_all_invalid tests/test_http_response.py::TextResponseTest::test_follow_all_links tests/test_http_response.py::TextResponseTest::test_follow_all_relative tests/test_http_response.py::TextResponseTest::test_follow_all_too_many_arguments tests/test_http_response.py::TextResponseTest::test_follow_all_whitespace tests/test_http_response.py::TextResponseTest::test_follow_all_whitespace_links tests/test_http_response.py::TextResponseTest::test_follow_flags tests/test_http_response.py::TextResponseTest::test_follow_link tests/test_http_response.py::TextResponseTest::test_follow_url_absolute tests/test_http_response.py::TextResponseTest::test_follow_url_relative tests/test_http_response.py::TextResponseTest::test_immutable_attributes tests/test_http_response.py::TextResponseTest::test_init tests/test_http_response.py::TextResponseTest::test_invalid_utf8_encoded_body_with_valid_utf8_BOM tests/test_http_response.py::TextResponseTest::test_replace tests/test_http_response.py::TextResponseTest::test_replace_wrong_encoding tests/test_http_response.py::TextResponseTest::test_unavailable_cb_kwargs tests/test_http_response.py::TextResponseTest::test_unavailable_meta tests/test_http_response.py::TextResponseTest::test_unicode_body tests/test_http_response.py::TextResponseTest::test_unicode_url tests/test_http_response.py::TextResponseTest::test_urljoin tests/test_http_response.py::TextResponseTest::test_urljoin_with_base_url tests/test_http_response.py::TextResponseTest::test_utf16 tests/test_http_response.py::HtmlResponseTest::test_bom_is_removed_from_body tests/test_http_response.py::HtmlResponseTest::test_copy tests/test_http_response.py::HtmlResponseTest::test_copy_cb_kwargs tests/test_http_response.py::HtmlResponseTest::test_copy_inherited_classes tests/test_http_response.py::HtmlResponseTest::test_copy_meta tests/test_http_response.py::HtmlResponseTest::test_declared_encoding_invalid tests/test_http_response.py::HtmlResponseTest::test_encoding tests/test_http_response.py::HtmlResponseTest::test_follow_None_url tests/test_http_response.py::HtmlResponseTest::test_follow_all_absolute tests/test_http_response.py::HtmlResponseTest::test_follow_all_flags tests/test_http_response.py::HtmlResponseTest::test_follow_all_invalid tests/test_http_response.py::HtmlResponseTest::test_follow_all_links tests/test_http_response.py::HtmlResponseTest::test_follow_all_relative tests/test_http_response.py::HtmlResponseTest::test_follow_all_too_many_arguments tests/test_http_response.py::HtmlResponseTest::test_follow_all_whitespace tests/test_http_response.py::HtmlResponseTest::test_follow_all_whitespace_links tests/test_http_response.py::HtmlResponseTest::test_follow_flags tests/test_http_response.py::HtmlResponseTest::test_follow_link tests/test_http_response.py::HtmlResponseTest::test_follow_url_absolute tests/test_http_response.py::HtmlResponseTest::test_follow_url_relative tests/test_http_response.py::HtmlResponseTest::test_html5_meta_charset tests/test_http_response.py::HtmlResponseTest::test_html_encoding tests/test_http_response.py::HtmlResponseTest::test_immutable_attributes tests/test_http_response.py::HtmlResponseTest::test_init tests/test_http_response.py::HtmlResponseTest::test_invalid_utf8_encoded_body_with_valid_utf8_BOM tests/test_http_response.py::HtmlResponseTest::test_replace tests/test_http_response.py::HtmlResponseTest::test_replace_wrong_encoding tests/test_http_response.py::HtmlResponseTest::test_unavailable_cb_kwargs tests/test_http_response.py::HtmlResponseTest::test_unavailable_meta tests/test_http_response.py::HtmlResponseTest::test_unicode_body tests/test_http_response.py::HtmlResponseTest::test_unicode_url tests/test_http_response.py::HtmlResponseTest::test_urljoin tests/test_http_response.py::HtmlResponseTest::test_urljoin_with_base_url tests/test_http_response.py::HtmlResponseTest::test_utf16 tests/test_http_response.py::XmlResponseTest::test_bom_is_removed_from_body tests/test_http_response.py::XmlResponseTest::test_copy tests/test_http_response.py::XmlResponseTest::test_copy_cb_kwargs tests/test_http_response.py::XmlResponseTest::test_copy_inherited_classes tests/test_http_response.py::XmlResponseTest::test_copy_meta tests/test_http_response.py::XmlResponseTest::test_declared_encoding_invalid tests/test_http_response.py::XmlResponseTest::test_encoding tests/test_http_response.py::XmlResponseTest::test_follow_None_url tests/test_http_response.py::XmlResponseTest::test_follow_all_absolute tests/test_http_response.py::XmlResponseTest::test_follow_all_flags tests/test_http_response.py::XmlResponseTest::test_follow_all_invalid tests/test_http_response.py::XmlResponseTest::test_follow_all_links tests/test_http_response.py::XmlResponseTest::test_follow_all_relative tests/test_http_response.py::XmlResponseTest::test_follow_all_too_many_arguments tests/test_http_response.py::XmlResponseTest::test_follow_all_whitespace tests/test_http_response.py::XmlResponseTest::test_follow_all_whitespace_links tests/test_http_response.py::XmlResponseTest::test_follow_flags tests/test_http_response.py::XmlResponseTest::test_follow_link tests/test_http_response.py::XmlResponseTest::test_follow_url_absolute tests/test_http_response.py::XmlResponseTest::test_follow_url_relative tests/test_http_response.py::XmlResponseTest::test_immutable_attributes tests/test_http_response.py::XmlResponseTest::test_init tests/test_http_response.py::XmlResponseTest::test_invalid_utf8_encoded_body_with_valid_utf8_BOM tests/test_http_response.py::XmlResponseTest::test_replace tests/test_http_response.py::XmlResponseTest::test_replace_encoding tests/test_http_response.py::XmlResponseTest::test_replace_wrong_encoding tests/test_http_response.py::XmlResponseTest::test_unavailable_cb_kwargs tests/test_http_response.py::XmlResponseTest::test_unavailable_meta tests/test_http_response.py::XmlResponseTest::test_unicode_body tests/test_http_response.py::XmlResponseTest::test_unicode_url tests/test_http_response.py::XmlResponseTest::test_urljoin tests/test_http_response.py::XmlResponseTest::test_urljoin_with_base_url tests/test_http_response.py::XmlResponseTest::test_utf16 tests/test_http_response.py::XmlResponseTest::test_xml_encoding
scrapy/http/response/text.py
scrapy/http/response/text.py