[3.7] bpo-32861: urllib.robotparser fix incomplete __str__ methods. (GH-5711) (GH-6795)
The urllib.robotparser's __str__ representation now includes wildcard
entries and the "Crawl-delay" and "Request-rate" fields.
(cherry picked from commit bd08a0af2d
)
Co-authored-by: Michael Lazar <lazar.michael22@gmail.com>
This commit is contained in:
parent
67d1968a41
commit
c3fa1f2b93
|
@ -246,6 +246,33 @@ Disallow: /cyberworld/map/
|
||||||
bad = ['/cyberworld/map/index.html']
|
bad = ['/cyberworld/map/index.html']
|
||||||
|
|
||||||
|
|
||||||
|
class StringFormattingTest(BaseRobotTest, unittest.TestCase):
|
||||||
|
robots_txt = """\
|
||||||
|
User-agent: *
|
||||||
|
Crawl-delay: 1
|
||||||
|
Request-rate: 3/15
|
||||||
|
Disallow: /cyberworld/map/ # This is an infinite virtual URL space
|
||||||
|
|
||||||
|
# Cybermapper knows where to go.
|
||||||
|
User-agent: cybermapper
|
||||||
|
Disallow: /some/path
|
||||||
|
"""
|
||||||
|
|
||||||
|
expected_output = """\
|
||||||
|
User-agent: cybermapper
|
||||||
|
Disallow: /some/path
|
||||||
|
|
||||||
|
User-agent: *
|
||||||
|
Crawl-delay: 1
|
||||||
|
Request-rate: 3/15
|
||||||
|
Disallow: /cyberworld/map/
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def test_string_formatting(self):
|
||||||
|
self.assertEqual(str(self.parser), self.expected_output)
|
||||||
|
|
||||||
|
|
||||||
class RobotHandler(BaseHTTPRequestHandler):
|
class RobotHandler(BaseHTTPRequestHandler):
|
||||||
|
|
||||||
def do_GET(self):
|
def do_GET(self):
|
||||||
|
|
|
@ -190,7 +190,10 @@ class RobotFileParser:
|
||||||
return self.default_entry.req_rate
|
return self.default_entry.req_rate
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return ''.join([str(entry) + "\n" for entry in self.entries])
|
entries = self.entries
|
||||||
|
if self.default_entry is not None:
|
||||||
|
entries = entries + [self.default_entry]
|
||||||
|
return '\n'.join(map(str, entries)) + '\n'
|
||||||
|
|
||||||
|
|
||||||
class RuleLine:
|
class RuleLine:
|
||||||
|
@ -222,10 +225,15 @@ class Entry:
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
ret = []
|
ret = []
|
||||||
for agent in self.useragents:
|
for agent in self.useragents:
|
||||||
ret.extend(["User-agent: ", agent, "\n"])
|
ret.append(f"User-agent: {agent}")
|
||||||
for line in self.rulelines:
|
if self.delay is not None:
|
||||||
ret.extend([str(line), "\n"])
|
ret.append(f"Crawl-delay: {self.delay}")
|
||||||
return ''.join(ret)
|
if self.req_rate is not None:
|
||||||
|
rate = self.req_rate
|
||||||
|
ret.append(f"Request-rate: {rate.requests}/{rate.seconds}")
|
||||||
|
ret.extend(map(str, self.rulelines))
|
||||||
|
ret.append('') # for compatibility
|
||||||
|
return '\n'.join(ret)
|
||||||
|
|
||||||
def applies_to(self, useragent):
|
def applies_to(self, useragent):
|
||||||
"""check if this entry applies to the specified agent"""
|
"""check if this entry applies to the specified agent"""
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
The urllib.robotparser's ``__str__`` representation now includes wildcard
|
||||||
|
entries and the "Crawl-delay" and "Request-rate" fields. Patch by
|
||||||
|
Michael Lazar.
|
Loading…
Reference in New Issue