【Python】HTMLParser:HTML解析

html.parser 是 Python 标准库中的一个模块,用于解析和处理 HTML。它的核心类是 HTMLParser,这个类提供了多种方法,允许你处理 HTML 文档的各个部分。我们可以按以下几个模块来详细讲解 html.parser 的功能和使用方法。

HTMLParser 类

HTMLParser 类是 html.parser 模块的核心类,用于解析HTML文档。通过继承这个类并重写其提供的回调方法,你可以自定义对HTML标签、属性和内容的处理方式。

初始化和基础使用

要使用 HTMLParser 类,通常需要继承它,并在子类中重写一些回调方法。这些方法会在解析过程中自动调用,允许你处理HTML文档的不同部分。

示例:自定义解析器
from html.parser import HTMLParser

# 创建自定义解析器类,继承HTMLParser
class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print(f"Start tag: {tag}")
        if attrs:
            for attr in attrs:
                print(f"  Attribute: {attr}")

    def handle_endtag(self, tag):
        print(f"End tag: {tag}")

    def handle_data(self, data):
        print(f"Data: {data}")

# 创建解析器实例
parser = MyHTMLParser()

# 解析HTML字符串
html_string = "<html><head><title>Test</title></head><body><h1>Title</h1><p>Hello, World!</p></body></html>"
parser.feed(html_string)

在这个例子中,MyHTMLParser 类继承了 HTMLParser,并重写了三个方法:handle_starttaghandle_endtaghandle_data。这些方法分别用于处理HTML文档中的开始标签、结束标签和数据内容。

输出结果

Start tag: html
Start tag: head
Start tag: title
Data: Test
End tag: title
End tag: head
Start tag: body
Start tag: h1
Data: Title
End tag: h1
Start tag: p
Data: Hello, World!
End tag: p
End tag: body
End tag: html

重要方法详解

HTMLParser 类提供了一些关键方法,这些方法会在解析HTML文档时自动调用。

handle_starttag(self, tag, attrs)
  • 功能: 当解析器遇到开始标签(如 <div>)时调用。
  • 参数:
    • tag 是标签的名字,例如 'div'
    • attrs 是一个包含(属性名, 属性值)元组的列表,例如 [('class', 'header')]
  • 用法示例:
def handle_starttag(self, tag, attrs):
    print(f"Start tag: {tag}")
    if attrs:
        for attr, value in attrs:
            print(f" - Attribute: {attr} = {value}")
handle_endtag(self, tag)
  • 功能: 当解析器遇到结束标签(如 </div>)时调用。
  • 参数:
    • tag 是标签的名字,例如 'div'
  • 用法示例:
def handle_endtag(self, tag):
    print(f"End tag: {tag}")
handle_startendtag(self, tag, attrs)
  • 功能: 当解析器遇到自闭合标签(如 <br />)时调用。
  • 参数:
    • tag 是标签的名字,例如 'br'
    • attrs 是一个包含(属性名, 属性值)元组的列表。
  • 用法示例:
def handle_startendtag(self, tag, attrs):
    print(f"Self-closing tag: {tag}")
    if attrs:
        for attr, value in attrs:
            print(f" - Attribute: {attr} = {value}")
handle_data(self, data)
  • 功能: 当解析器遇到标签之间的文本数据时调用。
  • 参数:
    • data 是标签之间的文本内容,例如 'Hello, World!'
  • 用法示例:
def handle_data(self, data):
    print(f"Data: {data}")
handle_comment(self, data)
  • 功能: 当解析器遇到HTML注释时调用。
  • 参数:
    • data 是注释的内容,例如 'This is a comment'
  • 用法示例:
def handle_comment(self, data):
    print(f"Comment: {data}")
handle_entityref(self, name)
  • 功能: 当解析器遇到命名字符引用(如 &)时调用。
  • 参数:
    • name 是实体引用的名字,例如 'amp'
  • 用法示例:
def handle_entityref(self, name):
    print(f"Named entity: &{name};")
handle_charref(self, name)
  • 功能: 当解析器遇到数字字符引用(如 {)时调用。
  • 参数:
    • name 是字符的编号,可以是十进制或十六进制,例如 '123'
  • 用法示例:
python复制代码def handle_charref(self, name):
    print(f"Numeric entity: &#{name};")

解析HTML文档的流程

当你调用 feed() 方法向 HTMLParser 对象提供HTML数据时,解析器会逐字符读取输入并调用相应的回调方法。例如:

  • 当解析到 <html> 标签时,handle_starttag 方法会被调用。
  • 解析到 </html> 时,handle_endtag 方法会被调用。
  • 在两个标签之间的文本内容(如 Hello, World!)会触发 handle_data 方法。
  • 遇到 <!-- This is a comment --> 时,handle_comment 会被调用。

常见操作实例

以下是一些常见的 HTMLParser 操作实例:

解析HTML标签和属性
class TagParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print(f"Tag: {tag}")
        for attr, value in attrs:
            print(f" - Attribute: {attr} = {value}")

html_code = '<a href="https://example.com" title="Example">Click here</a>'
parser = TagParser()
parser.feed(html_code)

输出

Tag: a
 - Attribute: href = https://example.com
 - Attribute: title = Example
解析HTML文本和注释
class ContentParser(HTMLParser):
    def handle_data(self, data):
        print(f"Data: {data}")

    def handle_comment(self, data):
        print(f"Comment: {data}")

html_code = '<p>This is a paragraph.<!-- This is a comment --></p>'
parser = ContentParser()
parser.feed(html_code)

输出

Data: This is a paragraph.
Comment: This is a comment

高级功能

处理特殊字符

HTMLParser 可以处理HTML实体和字符引用,如 &amp;&#123;

命名字符引用
class EntityParser(HTMLParser):
    def handle_entityref(self, name):
        print(f"Named entity: &{name};")

html_code = 'AT&amp;T'
parser = EntityParser()
parser.feed(html_code)

输出

Named entity: &amp;
数字字符引用
class CharRefParser(HTMLParser):
    def handle_charref(self, name):
        print(f"Numeric entity: &#{name};")

html_code = '&#169; 2023'
parser = CharRefParser()
parser.feed(html_code)

输出

Numeric entity: &#169;

处理HTML文档片段

HTMLParser 还可以解析HTML文档片段,并根据解析的情况做出不同的响应。

解析HTML文档片段
class FragmentParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print(f"Start tag: {tag}")

    def handle_endtag(self, tag):
        print(f"End tag: {tag}")

html_code = 'This is a <b>bold</b> statement.'
parser = FragmentParser()
parser.feed(html_code)

输出

Start tag: b
End tag: b

扩展与增强功能

停止解析

在某些情况下,你可能希望在解析过程中停止解析。

class StopParser(HTMLParser):
    def handle_data(self, data):
        print(f"Data: {data}")
        # 在遇到特定数据时停止解析
        if data == "stop":
            self.close()

html_code = '<p>start</p><p>stop</p><p>end</p>'
parser = StopParser()
parser.feed(html_code)

输出

Data: start
Data: stop

重置解析器

你可以使用 reset() 方法重置解析器,以便重新开始解析新的HTML内容。

class ResetParser(HTMLParser):
    def handle_data(self, data):
        print(f"Data: {data}")

html_code_1 = '<p>first part</p>'
html_code_2 = '<p>second part</p>'

parser = ResetParser()
parser.feed(html_code_1)

parser.reset()  # 重置解析器

parser.feed(html_code_2)

输出

Data: first part
Data: second part
按DOM模型解析html文件的工具包 已下是源码列表: META-INF/MANIFEST.MF META-INF/maven/org.htmlparser/htmlparser/pom.properties META-INF/maven/org.htmlparser/htmlparser/pom.xml org.htmlparser.Parser.class org.htmlparser.PrototypicalNodeFactory.class org.htmlparser.beans.BeanyBaby.class org.htmlparser.beans.FilterBean.class org.htmlparser.beans.HTMLLinkBean.class org.htmlparser.beans.HTMLTextBean.class org.htmlparser.beans.LinkBean.class org.htmlparser.beans.StringBean.class org.htmlparser.filters.AndFilter.class org.htmlparser.filters.CssSelectorNodeFilter.class org.htmlparser.filters.HasAttributeFilter.class org.htmlparser.filters.HasChildFilter.class org.htmlparser.filters.HasParentFilter.class org.htmlparser.filters.HasSiblingFilter.class org.htmlparser.filters.IsEqualFilter.class org.htmlparser.filters.LinkRegexFilter.class org.htmlparser.filters.LinkStringFilter.class org.htmlparser.filters.NodeClassFilter.class org.htmlparser.filters.NotFilter.class org.htmlparser.filters.OrFilter.class org.htmlparser.filters.RegexFilter.class org.htmlparser.filters.StringFilter.class org.htmlparser.filters.TagNameFilter.class org.htmlparser.http.HttpHeader.class org.htmlparser.sax.Attributes.class org.htmlparser.sax.Feedback.class org.htmlparser.sax.Locator.class org.htmlparser.sax.XMLReader.class org.htmlparser.scanners.CompositeTagScanner.class org.htmlparser.scanners.JspScanner.class org.htmlparser.scanners.ScriptDecoder.class org.htmlparser.scanners.ScriptScanner.class org.htmlparser.scanners.StyleScanner.class org.htmlparser.tags.AppletTag.class org.htmlparser.tags.BaseHrefTag.class org.htmlparser.tags.BlockquoteTag.class org.htmlparser.tags.BodyTag.class org.htmlparser.tags.Bullet.class org.htmlparser.tags.BulletList.class org.htmlparser.tags.CompositeTag.class org.htmlparser.tags.DefinitionList.class org.htmlparser.tags.DefinitionListBullet.class org.htmlparser.tags.Div.class org.htmlparser.tags.DoctypeTag.class org.htmlparser.tags.FormTag.class org.htmlparser.tags.FrameSetTag.class org.htmlparser.tags.FrameTag.class org.htmlparser.tags.HeadTag.class org.htmlparser.tags.HeadingTag.class org.htmlparser.tags.Html.class org.htmlparser.tags.ImageTag.class org.htmlparser.tags.InputTag.class org.htmlparser.tags.JspTag.class org.htmlparser.tags.LabelTag.class org.htmlparser.tags.LinkTag.class org.htmlparser.tags.MetaTag.class org.htmlparser.tags.ObjectTag.class org.htmlparser.tags.OptionTag.class org.htmlparser.tags.ParagraphTag.class org.htmlparser.tags.ProcessingInstructionTag.class org.htmlparser.tags.ScriptTag.class org.htmlparser.tags.SelectTag.class org.htmlparser.tags.Span.class org.htmlparser.tags.StyleTag.class org.htmlparser.tags.TableColumn.class org.htmlparser.tags.TableHeader.class org.htmlparser.tags.TableRow.class org.htmlparser.tags.TableTag.class org.htmlparser.tags.TextareaTag.class org.htmlparser.tags.TitleTag.class org.htmlparser.util.CharacterReference.class org.htmlparser.util.CharacterReferenceEx.class org.htmlparser.util.DefaultParserFeedback.class org.htmlparser.util.FeedbackManager.class org.htmlparser.util.IteratorImpl.class org.htmlparser.util.NodeTreeWalker.class org.htmlparser.util.ParserFeedback.class org.htmlparser.util.ParserUtils.class org.htmlparser.util.Translate.class org.htmlparser.visitors.HtmlPage.class org.htmlparser.visitors.LinkFindingVisitor.class org.htmlparser.visitors.ObjectFindingVisitor.class org.htmlparser.visitors.StringFindingVisitor.class org.htmlparser.visitors.TagFindingVisitor.class org.htmlparser.visitors.TextExtractingVisitor.class org.htmlparser.visitors.UrlModifyingVisitor.class org/htmlparser/beans/images/Chain16.gif org/htmlparser/beans/images/Chain32.gif org/htmlparser/beans/images/Knot16.gif org/htmlparser/beans/images/Knot32.gif
org.htmlparser.Tag org.htmlparser.Node org.htmlparser.Text org.htmlparser.Parser org.htmlparser.Remark org.htmlparser.tags.Div org.htmlparser.Attribute org.htmlparser.tags.Html org.htmlparser.tags.Span org.htmlparser.NodeFilter org.htmlparser.lexer.Page org.htmlparser.NodeFactory org.htmlparser.http.Cookie org.htmlparser.lexer.Lexer org.htmlparser.sax.Locator org.htmlparser.tags.Bullet org.htmlparser.tags.JspTag org.htmlparser.lexer.Cursor org.htmlparser.lexer.Source org.htmlparser.lexer.Stream org.htmlparser.sax.Feedback org.htmlparser.tags.BodyTag org.htmlparser.tags.FormTag org.htmlparser.tags.HeadTag org.htmlparser.tags.LinkTag org.htmlparser.tags.MetaTag org.htmlparser.nodes.TagNode org.htmlparser.sax.XMLReader org.htmlparser.tags.FrameTag org.htmlparser.tags.ImageTag org.htmlparser.tags.InputTag org.htmlparser.tags.LabelTag org.htmlparser.tags.StyleTag org.htmlparser.tags.TableRow org.htmlparser.tags.TableTag org.htmlparser.tags.TitleTag org.htmlparser.util.NodeList org.htmlparser.beans.LinkBean org.htmlparser.nodes.TextNode org.htmlparser.sax.Attributes org.htmlparser.tags.AppletTag org.htmlparser.tags.ObjectTag org.htmlparser.tags.OptionTag org.htmlparser.tags.ScriptTag org.htmlparser.tags.SelectTag org.htmlparser.util.Translate org.htmlparser.util.sort.Sort org.htmlparser.beans.BeanyBaby org.htmlparser.http.HttpHeader org.htmlparser.lexer.PageIndex org.htmlparser.tags.BulletList org.htmlparser.tags.DoctypeTag org.htmlparser.tags.HeadingTag org.htmlparser.util.NodeList$1 org.htmlparser.beans.FilterBean org.htmlparser.beans.StringBean org.htmlparser.filters.OrFilter org.htmlparser.nodes.RemarkNode org.htmlparser.scanners.Scanner org.htmlparser.tags.BaseHrefTag org.htmlparser.tags.FrameSetTag org.htmlparser.tags.TableColumn org.htmlparser.tags.TableHeader org.htmlparser.tags.TextareaTag org.htmlparser.util.ParserUtils org.htmlparser.beans.BeanyBaby$1 org.htmlparser.filters.AndFilter org.htmlparser.filters.NotFilter org.htmlparser.filters.XorFilter org.htmlparser.tags.CompositeTag org.htmlparser.tags.ParagraphTag org.htmlparser.util.IteratorImpl org.htmlparser.util.NodeIterator org.htmlparser.visitors.HtmlPage org.htmlparser.util.sort.Ordered org.htmlparser.beans.HTMLLinkBean org.htmlparser.beans.HTMLTextBean org.htmlparser.lexer.StringSource org.htmlparser.nodes.AbstractNode org.htmlparser.util.sort.Sortable org.htmlparser.filters.RegexFilter org.htmlparser.lexer.PageAttribute org.htmlparser.scanners.JspScanner org.htmlparser.scanners.TagScanner org.htmlparser.tags.DefinitionList org.htmlparser.util.NodeTreeWalker org.htmlparser.util.ParserFeedback org.htmlparser.filters.StringFilter org.htmlparser.util.FeedbackManager org.htmlparser.util.ParserException org.htmlparser.visitors.NodeVisitor org.htmlparser.filters.IsEqualFilter org.htmlparser.filters.TagNameFilter org.htmlparser.scanners.StyleScanner org.htmlparser.util.ChainedException org.htmlparser.filters.HasChildFilter org.htmlparser.http.ConnectionManager org.htmlparser.http.ConnectionMonitor org.htmlparser.scanners.ScriptDecoder org.htmlparser.scanners.ScriptScanner org.htmlparser.PrototypicalNodeFactory org.htmlparser.filters.HasParentFilter org.htmlparser.filters.LinkRegexFilter org.htmlparser.filters.NodeClassFilter org.htmlparser.lexer.InputStreamSource org.htmlparser.util.CharacterReference org.htmlparser.util.SimpleNodeIterator org.htmlparser.filters.HasSiblingFilter org.htmlparser.filters.LinkStringFilter org.htmlparser.tags.DefinitionListBullet org.htmlparser.util.CharacterReferenceEx org.htmlparser.filters.HasAttributeFilter org.htmlparser.util.DefaultParserFeedback org.htmlparser.visitors.TagFindingVisitor org.htmlparser.visitors.LinkFindingVisitor org.htmlparser.scanners.CompositeTagScanner org.htmlparser.util.EncodingChangeException org.htmlparser.visitors.UrlModifyingVisitor org.htmlparser.filters.CssSelectorNodeFilter org.htmlparser.tags.ProcessingInstructionTag org.htmlparser.visitors.ObjectFindingVisitor org.htmlparser.visitors.StringFindingVisitor org.htmlparser.visitors.TextExtractingVisitor org.htmlparser.filters.CssSelectorNodeFilter$1 org.htmlparser.parserapplications.SiteCapturer org.htmlparser.parserapplications.WikiCapturer org.htmlparser.parserapplications.LinkExtractor org.htmlparser.parserapplications.LinkExtractor$1 org.htmlparser.parserapplications.StringExtractor org.htmlparser.filters.CssSelectorNodeFilter$YesFilter org.htmlparser.parserapplications.filterbuilder.Filter org.htmlparser.filters.CssSelectorNodeFilter$AdjacentFilter org.htmlparser.parserapplications.SiteCapturer$LocalLinkTag org.htmlparser.parserapplications.SiteCapturer$LocalFrameTag org.htmlparser.parserapplications.SiteCapturer$LocalImageTag org.htmlparser.parserapplications.filterbuilder.FilterBuilder org.htmlparser.parserapplications.filterbuilder.HtmlTreeModel org.htmlparser.parserapplications.filterbuilder.SubFilterList org.htmlparser.filters.CssSelectorNodeFilter$AttribMatchFilter org.htmlparser.filters.CssSelectorNodeFilter$HasAncestorFilter org.htmlparser.parserapplications.SiteCapturer$LocalBaseHrefTag org.htmlparser.parserapplications.filterbuilder.HtmlTreeCellRenderer org.htmlparser.parserapplications.filterbuilder.wrappers.OrFilterWrapper org.htmlparser.parserapplications.filterbuilder.layouts.NullLayoutManager org.htmlparser.parserapplications.filterbuilder.wrappers.AndFilterWrapper org.htmlparser.parserapplications.filterbuilder.wrappers.NotFilterWrapper org.htmlparser.parserapplications.filterbuilder.wrappers.RegexFilterWrapper org.htmlparser.parserapplications.filterbuilder.wrappers.StringFilterWrapper org.htmlparser.parserapplications.filterbuilder.layouts.VerticalLayoutManager org.htmlparser.parserapplications.filterbuilder.wrappers.TagNameFilterWrapper org.htmlparser.parserapplications.filterbuilder.wrappers.HasChildFilterWrapper org.htmlparser.parserapplications.filterbuilder.wrappers.HasParentFilterWrapper org.htmlparser.parserapplications.filterbuilder.wrappers.NodeClassFilterWrapper org.htmlparser.parserapplications.filterbuilder.wrappers.HasSiblingFilterWrapper org.htmlparser.parserapplications.filterbuilder.wrappers.HasAttributeFilterWrapper
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值