Skip to content

robotparser reads empty robots.txt file as "all denied" #79638

Closed

Description

@larsfuse
mannequin
BPO 35457
Nosy @terryjreedy, @berkerpeksag, @tirkarthi, @andreburgaud

Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

Show more details

GitHub fields:

assignee = None
closed_at = None
created_at = <Date 2018-12-11.09:30:47.872>
labels = ['3.8', 'type-feature', 'library']
title = 'robotparser reads empty robots.txt file as "all denied"'
updated_at = <Date 2020-01-02.15:45:55.440>
user = 'https://bugs.python.org/larsfuse'

bugs.python.org fields:

activity = <Date 2020-01-02.15:45:55.440>
actor = 'gallicrooster'
assignee = 'none'
closed = False
closed_date = None
closer = None
components = ['Library (Lib)']
creation = <Date 2018-12-11.09:30:47.872>
creator = 'larsfuse'
dependencies = []
files = []
hgrepos = []
issue_num = 35457
keywords = []
message_count = 6.0
messages = ['331595', '331870', '331963', '359180', '359185', '359202']
nosy_count = 5.0
nosy_names = ['terry.reedy', 'berker.peksag', 'xtreak', 'larsfuse', 'gallicrooster']
pr_nums = []
priority = 'normal'
resolution = None
stage = 'test needed'
status = 'open'
superseder = None
type = 'enhancement'
url = 'https://bugs.python.org/issue35457'
versions = ['Python 3.8']

Linked PRs

Activity

  1. larsfuse commented on Dec 11, 2018

    larsfusemannequin
    MannequinAuthor

    The standard (http://www.robotstxt.org/robotstxt.html) says:

    To allow all robots complete access:
    User-agent: *
    Disallow:
    (or just create an empty "/robots.txt" file, or don't use one at all)

    Here I give python an empty file:
    $ curl http://10.223.68.186/robots.txt
    $

    Code:

    rp = robotparser.RobotFileParser()
    print (robotsurl)
    rp.set_url(robotsurl)
    rp.read()
    print( "fetch /", rp.can_fetch(useragent = "*", url = "/"))
    print( "fetch /admin", rp.can_fetch(useragent = "*", url = "/admin"))

    Result:

    $ ./test.py
    http://10.223.68.186/robots.txt
    ('fetch /', False)
    ('fetch /admin', False)

    And the result is, robotparser thinks the site is blocked.

  2. added
    type-bugAn unexpected behavior, bug, or error
    stdlibStandard Library Python modules in the Lib/ directory
    on Dec 11, 2018
  3. terryjreedy commented on Dec 14, 2018

    @terryjreedy
    Member

    https://docs.python.org/2.7/library/robotparser.html#module-robotparser
    and
    https://docs.python.org/3/library/urllib.robotparser.html#module-urllib.robotparser
    refers users, for file structure, to http://www.robotstxt.org/orig.html.
    This says nothing about the effect of an empty file, so I don't see this as a bug. Even if it was, I would be dubious about reversing the effect without a deprecation notice first, and definitely not in 2.7.

    I would propose instead that the doc be changed to refer to the new file, with more and better examples, but add a note that robotparser interprets empty files as 'block all' rather than 'allow all'.

    Try bringing this up on python-ideas.

  4. added
    type-featureA feature request or enhancement
    and removed
    type-bugAn unexpected behavior, bug, or error
    on Dec 14, 2018
  5. larsfuse commented on Dec 17, 2018

    larsfusemannequin
    MannequinAuthor

    (...) refers users, for file structure, to http://www.robotstxt.org/orig.html. This says nothing about the effect of an empty file, so I don't see this as a bug.

    That is incorrect. From that url you can find:

    The presence of an empty "/robots.txt" file has no explicit associated semantics, it will be treated as if it was not present, i.e. all robots will consider themselves welcome.

    So this is definitely a bug.

  6. andreburgaud commented on Jan 2, 2020

    andreburgaudmannequin
    Mannequin

    Hi,

    Is this ticket still relevant for Python 3.8?

    While running some tests with an empty robotstxt file I realized that it was returning "ALLOWED" for any path (as per the current draft of the Robots Exclusion Protocol: https://tools.ietf.org/html/draft-koster-rep-00#section-2.2.1 ")

    Code:

    from urllib import robotparser
    
    robots_url = "file:///tmp/empty.txt"
    
    rp = robotparser.RobotFileParser()
    print(robots_url)
    rp.set_url(robots_url)
    rp.read()
    print( "fetch /", rp.can_fetch(useragent = "*", url = "/"))
    print( "fetch /admin", rp.can_fetch(useragent = "*", url = "/admin"))

    Output:

    $ cat /tmp/empty.txt
    $ python -V
    Python 3.8.1
    $ python test_robot3.py
    file:///tmp/empty.txt
    fetch / True
    fetch /admin True
  7. tirkarthi commented on Jan 2, 2020

    @tirkarthi
    Member

    There is a behavior change. parse() sets the modified time and unless the modified time is set the can_fetch method returns false. In Python 2 the parse method was called only when the file is non-empty [0] but in Python 3 it's always called though the file is empty [1] . The change was done with 1afc169 to always read parse and then in 122541b modified function was always called during parse thus setting the modified_time to return True from can_fetch in the end.

    I think the behavior of robotparser for empty file was undefined allowing these changes and it will be good to have a test for this behavior.

    [0]

    elif self.errcode == 200 and lines:
    self.parse(lines)

    [1]
    raw = f.read()
    self.parse(raw.decode("utf-8").splitlines())

  8. andreburgaud commented on Jan 2, 2020

    andreburgaudmannequin
    Mannequin

    Thanks @XTreak for providing some clarification on this behavior! I can write some tests to cover this behavior, assuming that we agree that an empty file means "unlimited access". This was worded as such in the old internet draft from 1996 (section 3.2.1 in https://www.robotstxt.org/norobots-rfc.txt). The current draft is more ambiguous with "If no group satisfies either condition, or no groups are present at all, no rules apply." https://tools.ietf.org/html/draft-koster-rep-00#section-2.2.1

    https://www.robotstxt.org/robotstxt.html clearly states that an empty file gives full access, but I'm getting lost in figuring out which is the official spec at the moment :-)

  9. transferred this issue fromon Apr 10, 2022
  10. added
    3.15bugs and security fixes
    and removed on Sep 4, 2025
  11. 3 remaining items

  12. added 2 commits that reference this issue on Sep 5, 2025
  13. added a commit that references this issue on May 7, 2026
  14. added a commit that references this issue on May 7, 2026
  15. added a commit that references this issue on May 8, 2026
  16. serhiy-storchaka commented on May 8, 2026

    @serhiy-storchaka
    Member

    Since currently robotparser disallows access to all resource if the HTTP status code was 500-599, adding new tests is enough.

  17. added 3 commits that reference this issue on May 8, 2026
  18. added 4 commits that reference this issue on Jul 5, 2026
  19. added a commit that references this issue on Aug 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

3.15bugs and security fixesstdlibStandard Library Python modules in the Lib/ directorytype-featureA feature request or enhancement

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions