We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Document link extractor usage outside CrawlSpider rules
https://docs.scrapy.org/en/latest/topics/link-extractors.html mentions that link extractors may be used outside `CrawlSpider`, but it does not go into detail on how to do that.

Also, there are broken references to `scrapy.link.Link`, we should provide reference documentation for that class.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `scrapy/link.py`
Content:
```
1 """
2 This module defines the Link object used in Link extractors.
3 
4 For actual link extractors implementation see scrapy.linkextractors, or
5 its documentation in: docs/topics/link-extractors.rst
6 """
7 
8 
9 class Link:
10     """Link objects represent an extracted link by the LinkExtractor."""
11 
12     __slots__ = ['url', 'text', 'fragment', 'nofollow']
13 
14     def __init__(self, url, text='', fragment='', nofollow=False):
15         if not isinstance(url, str):
16             got = url.__class__.__name__
17             raise TypeError(f"Link urls must be str objects, got {got}")
18         self.url = url
19         self.text = text
20         self.fragment = fragment
21         self.nofollow = nofollow
22 
23     def __eq__(self, other):
24         return (
25             self.url == other.url
26             and self.text == other.text
27             and self.fragment == other.fragment
28             and self.nofollow == other.nofollow
29         )
30 
31     def __hash__(self):
32         return hash(self.url) ^ hash(self.text) ^ hash(self.fragment) ^ hash(self.nofollow)
33 
34     def __repr__(self):
35         return (
36             f'Link(url={self.url!r}, text={self.text!r}, '
37             f'fragment={self.fragment!r}, nofollow={self.nofollow!r})'
38         )
39
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/scrapy/link.py b/scrapy/link.py
--- a/scrapy/link.py
+++ b/scrapy/link.py
@@ -7,7 +7,22 @@
 
 
 class Link:
-    """Link objects represent an extracted link by the LinkExtractor."""
+    """Link objects represent an extracted link by the LinkExtractor.
+
+    Using the anchor tag sample below to illustrate the parameters::
+
+            <a href="https://example.com/nofollow.html#foo" rel="nofollow">Dont follow this one</a>
+
+    :param url: the absolute url being linked to in the anchor tag.
+                From the sample, this is ``https://example.com/nofollow.html``.
+
+    :param text: the text in the anchor tag. From the sample, this is ``Dont follow this one``.
+
+    :param fragment: the part of the url after the hash symbol. From the sample, this is ``foo``.
+
+    :param nofollow: an indication of the presence or absence of a nofollow value in the ``rel`` attribute
+                    of the anchor tag.
+    """
 
     __slots__ = ['url', 'text', 'fragment', 'nofollow']

{"golden_diff": "diff --git a/scrapy/link.py b/scrapy/link.py\n--- a/scrapy/link.py\n+++ b/scrapy/link.py\n@@ -7,7 +7,22 @@\n \n \n class Link:\n-    \"\"\"Link objects represent an extracted link by the LinkExtractor.\"\"\"\n+    \"\"\"Link objects represent an extracted link by the LinkExtractor.\n+\n+    Using the anchor tag sample below to illustrate the parameters::\n+\n+            <a href=\"https://example.com/nofollow.html#foo\" rel=\"nofollow\">Dont follow this one</a>\n+\n+    :param url: the absolute url being linked to in the anchor tag.\n+                From the sample, this is ``https://example.com/nofollow.html``.\n+\n+    :param text: the text in the anchor tag. From the sample, this is ``Dont follow this one``.\n+\n+    :param fragment: the part of the url after the hash symbol. From the sample, this is ``foo``.\n+\n+    :param nofollow: an indication of the presence or absence of a nofollow value in the ``rel`` attribute\n+                    of the anchor tag.\n+    \"\"\"\n \n     __slots__ = ['url', 'text', 'fragment', 'nofollow']\n", "issue": "Document link extractor usage outside CrawlSpider rules\nhttps://docs.scrapy.org/en/latest/topics/link-extractors.html mentions that link extractors may be used outside `CrawlSpider`, but it does not go into detail on how to do that.\r\n\r\nAlso, there are broken references to `scrapy.link.Link`, we should provide reference documentation for that class.\n", "before_files": [{"content": "\"\"\"\nThis module defines the Link object used in Link extractors.\n\nFor actual link extractors implementation see scrapy.linkextractors, or\nits documentation in: docs/topics/link-extractors.rst\n\"\"\"\n\n\nclass Link:\n    \"\"\"Link objects represent an extracted link by the LinkExtractor.\"\"\"\n\n    __slots__ = ['url', 'text', 'fragment', 'nofollow']\n\n    def __init__(self, url, text='', fragment='', nofollow=False):\n        if not isinstance(url, str):\n            got = url.__class__.__name__\n            raise TypeError(f\"Link urls must be str objects, got {got}\")\n        self.url = url\n        self.text = text\n        self.fragment = fragment\n        self.nofollow = nofollow\n\n    def __eq__(self, other):\n        return (\n            self.url == other.url\n            and self.text == other.text\n            and self.fragment == other.fragment\n            and self.nofollow == other.nofollow\n        )\n\n    def __hash__(self):\n        return hash(self.url) ^ hash(self.text) ^ hash(self.fragment) ^ hash(self.nofollow)\n\n    def __repr__(self):\n        return (\n            f'Link(url={self.url!r}, text={self.text!r}, '\n            f'fragment={self.fragment!r}, nofollow={self.nofollow!r})'\n        )\n", "path": "scrapy/link.py"}], "after_files": [{"content": "\"\"\"\nThis module defines the Link object used in Link extractors.\n\nFor actual link extractors implementation see scrapy.linkextractors, or\nits documentation in: docs/topics/link-extractors.rst\n\"\"\"\n\n\nclass Link:\n    \"\"\"Link objects represent an extracted link by the LinkExtractor.\n\n    Using the anchor tag sample below to illustrate the parameters::\n\n            <a href=\"https://example.com/nofollow.html#foo\" rel=\"nofollow\">Dont follow this one</a>\n\n    :param url: the absolute url being linked to in the anchor tag.\n                From the sample, this is ``https://example.com/nofollow.html``.\n\n    :param text: the text in the anchor tag. From the sample, this is ``Dont follow this one``.\n\n    :param fragment: the part of the url after the hash symbol. From the sample, this is ``foo``.\n\n    :param nofollow: an indication of the presence or absence of a nofollow value in the ``rel`` attribute\n                    of the anchor tag.\n    \"\"\"\n\n    __slots__ = ['url', 'text', 'fragment', 'nofollow']\n\n    def __init__(self, url, text='', fragment='', nofollow=False):\n        if not isinstance(url, str):\n            got = url.__class__.__name__\n            raise TypeError(\"Link urls must be str objects, got %s\" % got)\n        self.url = url\n        self.text = text\n        self.fragment = fragment\n        self.nofollow = nofollow\n\n    def __eq__(self, other):\n        return (\n            self.url == other.url\n            and self.text == other.text\n            and self.fragment == other.fragment\n            and self.nofollow == other.nofollow\n        )\n\n    def __hash__(self):\n        return hash(self.url) ^ hash(self.text) ^ hash(self.fragment) ^ hash(self.nofollow)\n\n    def __repr__(self):\n        return (\n            'Link(url=%r, text=%r, fragment=%r, nofollow=%r)'\n            % (self.url, self.text, self.fragment, self.nofollow)\n        )\n", "path": "scrapy/link.py"}]}