Skip to content

HTMLParser does not support escapable raw text mode (<textarea> and <title>) #118350

Description

@savchenko

Bug report

Bug description:

An example where parsing stops after the <style color="red">:

from html.parser import HTMLParser
from io import StringIO

class HTML2text(HTMLParser):
    def __init__(self):
        super().__init__()
        self.data = StringIO()
    def handle_data(self, html):
        self.data.write(html)
    def get_data(self):
        return self.data.getvalue().strip()

html_test = '''
<!DOCTYPE html>
<head><title>Glued</title></head><body><some><style color="red">title</bar>
<h1>Spacious             </h1><a href="https://heading.net">heading.net</a>
<span>not<a href="https://www.arpa.home">my.home.arpa</a><p>        URL</p>
</body></html>
'''

parser = HTML2text()
parser.feed(html_test)
print(parser.get_data())

Changing a single character in the word "style" restores the normal functionality.

CPython versions tested on:

3.11

Operating systems tested on:

Linux

Linked PRs

Activity

  1. JelleZijlstra commented on Apr 27, 2024

    @JelleZijlstra
    Member

    Isn't this because you didn't close your <style> tag? If I remember correctly style tags go on until </style> is seen regardless of any other tag-like text within the tag, because they may contain text in other languages.

  2. savchenko commented on Apr 28, 2024

    @savchenko
    Author

    @JelleZijlstra , indeed! Closing <style> allows the snippet to be parsed. However, isn't it inconsistent with the the behaviour observed when parsing other tags?

    For example, this broken HTML is parsed correctly:

    <head><title>Rebelious<h1>Heading<a href="https://example.net">example.net
    <span>not<a href="https://www.arpa.home">arpa.home<p>Paragraph<h2>and more
  3. vadmium commented on Apr 28, 2024

    @vadmium
    Member

    The difference is that <style> is a “raw text element”. It cannot contain HTML markup. Most other tags can be followed by other markup. See https://html.spec.whatwg.org/multipage/syntax.html#raw-text-elements

    However I believe your HTML with <title>Rebelious<h1> . . . does trigger a bug. The <title> element is supposed to be an “escapable raw text element”, so <h1> should be counted as part of the raw title text. However it gets parsed as a tag:

    Encountered a start tag: title
    Encountered some data : Rebelious
    Encountered a start tag: h1

  4. self-assigned this
    on Jul 14, 2024
  5. serhiy-storchaka commented on May 7, 2025

    @serhiy-storchaka
    Member

    The original issue (about unclosed <style>) looks like a duplicate of #86155.

  6. changed the title [-]HTMLParser stops parsing upon encountering `<style>` tag[/-] [+]HTMLParser does not support escapable raw text mode (<textarea> and <title>)[/+] on Jul 14, 2025
  7. 11 remaining items

  8. added a commit that references this issue on Aug 4, 2025
  9. added 3 commits that reference this issue on Aug 14, 2025
  10. added a commit that references this issue on Aug 19, 2025
  11. added a commit that references this issue on Sep 9, 2025
  12. added 3 commits that reference this issue on Sep 13, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

3.10 (EOL)end of life3.11only security fixes3.12only security fixes3.13only security fixes3.14bugs and security fixes3.15bugs and security fixes3.9 (EOL)end of lifetype-bugAn unexpected behavior, bug, or errortype-securityA security issue

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions