对html的解析是网页抓取的基础,分析抓取的结果找到自己想要的内容或标签以达到抓取的目的。
HTMLParser是python用来解析html的模块。它可以分析出html里面的标签、数据等等,是一种处理html的简便途径。 HTMLParser采用的是一种事件驱动的模式,当HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来通知程序处理。它主要的用户回调函数的命名都是以handler_开头的,都是HTMLParser的成员函数。当我们使用时,就从HTMLParser派生出新的类,然后重新定义这几个以handler_开头的函数即可。这几个函数包括:
- handle_startendtag 处理开始标签和结束标签
- handle_starttag 处理开始标签,比如<xx>
- handle_endtag 处理结束标签,比如</xx>
- handle_charref 处理特殊字符串,就是以&#开头的,一般是内码表示的字符
- handle_entityref 处理一些特殊字符,以&开头的,比如
- handle_data 处理数据,就是<xx>data</xx>中间的那些数据
- handle_comment 处理注释
- handle_decl 处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
- handle_pi 处理形如<?instruction>的东西
1. 基本解析,找到开始和结束标签
from html.parser import HTMLParser class MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): print("Encountered the beginning of a %s tag" %(tag)) def handle_endtag(self, tag): print ("Encountered the end of a %s tag" %(tag)) if __name__ == '__main__': a = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><!--insert javaScript here!--><title>test</title><body><a href="http: //www.163.com">链接到163</a></body></html>' m = MyHTMLParser() #传入要分析的html模块 m.feed(a)
运行结果
Encountered the beginning of a html tag
Encountered the beginning of a head tag
Encountered the beginning of a title tag
Encountered the end of a title tag
Encountered the beginning of a body tag
Encountered the beginning of a a tag
Encountered the end of a a tag
Encountered the end of a body tag
Encountered the end of a html tag
Encountered the beginning of a head tag
Encountered the beginning of a title tag
Encountered the end of a title tag
Encountered the beginning of a body tag
Encountered the beginning of a a tag
Encountered the end of a a tag
Encountered the end of a body tag
Encountered the end of a html tag
2. 解析html的超链接和链接显示的内容
from html.parser import HTMLParser class MyHTMLParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.flag=None def handle_starttag(self, tag, attrs): # 这里重新定义了处理开始标签的函数 if tag == 'a': # 判断标签<a>的属性 self.flag='a' for name,value in attrs: if name == 'href': print("href:"+value) def handle_data(self,data): if self.flag == 'a': print("data:"+data) if __name__ == '__main__': a = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><!--insert javaScript here!--><title>test</title><body><a href="http: //www.163.com">链接到163</a></body></html>' my = MyHTMLParser() my.feed(a)
运行结果
href:http: //www.163.com
data:链接到163
data:链接到163
3. 完整解析html元素,拼接后原样输出
from html.parser import HTMLParser import html.entities class BaseHTMLProcessor(HTMLParser): def reset(self): # extend (called by HTMLParser.__init__) self.pieces = [] HTMLParser.reset(self) def handle_starttag(self, tag, attrs): # called for each start tag # attrs is a list of (attr, value) tuples # e.g. for <pre class="screen">, tag="pre", attrs=[("class", "screen")] # Ideally we would like to reconstruct original tag and attributes, but # we may end up quoting attribute values that weren't quoted in the source # document, or we may change the type of quotes around the attribute value # (single to double quotes). # Note that improperly embedded non-HTML code (like client-side Javascript) # may be parsed incorrectly by the ancestor, causing runtime script errors. # All non-HTML code must be enclosed in HTML comment tags (<!-- code -->) # to ensure that it will pass through this parser unaltered (in handle_comment). strattrs = "".join([' %s="%s"' % (key, value) for key, value in attrs]) self.pieces.append("<%(tag)s%(strattrs)s>" % locals()) def handle_endtag(self, tag): # called for each end tag, e.g. for </pre>, tag will be "pre" # Reconstruct the original end tag. self.pieces.append("</%(tag)s>" % locals()) def handle_charref(self, ref): # called for each character reference, e.g. for " ", ref will be "160" # Reconstruct the original character reference. self.pieces.append("&#%(ref)s;" % locals()) def handle_entityref(self, ref): # called for each entity reference, e.g. for "©", ref will be "copy" # Reconstruct the original entity reference. self.pieces.append("&%(ref)s" % locals()) # standard HTML entities are closed with a semicolon; other entities are not if entities.entitydefs.has_key(ref): self.pieces.append(";") def handle_data(self, text): # called for each block of plain text, i.e. outside of any tag and # not containing any character or entity references # Store the original text verbatim. self.pieces.append(text) def handle_comment(self, text): # called for each HTML comment, e.g. <!-- insert Javascript code here --> # Reconstruct the original comment. # It is especially important that the source document enclose client-side # code (like Javascript) within comments so it can pass through this # processor undisturbed; see comments in unknown_starttag for details. self.pieces.append("<!--%(text)s-->" % locals()) def handle_pi(self, text): # called for each processing instruction, e.g. <?instruction> # Reconstruct original processing instruction. self.pieces.append("<?%(text)s>" % locals()) def handle_decl(self, text): # called for the DOCTYPE, if present, e.g. # <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" # "http://www.w3.org/TR/html4/loose.dtd"> # Reconstruct original DOCTYPE self.pieces.append("<!%(text)s>" % locals()) def output(self): """Return processed HTML as a single string""" return "".join(self.pieces) if __name__ == '__main__': a = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><!--insert javaScript here!--><title>test</title><body><a href="http: //www.163.com">链接到163</a></body></html>' bhp =BaseHTMLProcessor() bhp.feed(a) print(bhp.output())
运行结果
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><!--insert javaScript here!--><title>test</title><body><a href="http: //www.163.com">链接到163</a></body></html>
相关推荐
2. **网络请求与HTML解析**:首先,我们需要使用`requests`库获取HTML网页内容。`requests`库提供了一个简单易用的接口来发送HTTP请求。然后,我们利用`beautifulsoup4`库解析HTML,这个库能够帮助我们提取出需要的...
**Python网页信息抓取技术详解** 网页信息抓取,也称为网络爬虫或网页抓取,是通过自动化程序从互联网上获取大量数据的过程。在这个领域,Python语言因其强大的库支持和简洁的语法而成为首选工具。本教程将深入探讨...
Python 网页抓取讲解 Python 网页抓取是指使用 Python 语言从互联网上抓取数据的过程。该技术广泛应用于数据挖掘、机器学习、自然语言处理等领域。下面是 Python 网页抓取的详细讲解: 一、为什么需要网页抓取 ...
在IT行业中,Python语言因其简洁明了的语法和强大的库支持而被广泛应用于网页数据抓取和数据分析领域。本主题将深入探讨如何使用Python进行网页数据抓取,并介绍如何利用这些数据创建表格,同时涉及CSS文件的生成和...
本文实例讲述了Python实现抓取网页生成Excel文件的方法。分享给大家供大家参考,具体如下: Python抓网页,主要用到了PyQuery,这个跟jQuery用法一样,超级给力 示例代码如下: #-*- encoding:utf-8 -*- import sys...
在这个"python抓取淘宝天猫网页商品详情Demo"中,我们将探讨如何利用Python进行网页抓取,特别是针对淘宝和天猫的商品详情页面。 首先,我们需要理解网页抓取的基本原理。网页抓取,也称为网络爬虫,是通过模拟...
总的来说,这个Python爬虫项目展示了如何结合网络请求、HTML解析、文件下载和多媒体处理等技术,实现自动抓取和合成m3u8网页视频。通过学习和实践此类项目,开发者不仅可以提升自己的Python编程能力,还能深入理解...
python爬虫实例 requests+beautifulsoup4解析 HTML 页面一个简单的网页上抓取标题和链接 Python 爬虫是一种自动化程序,用于从网站上抓取数据。这里我将提供一个简单的 Python 爬虫实例,使用 requests 库来发送 ...
在Python中,网页数据抓取和解析是一项常见的任务,尤其是在数据科学、网络爬虫和自动化测试等领域。BeautifulSoup是一个强大的库,它能够解析HTML和XML文档,提供简单直观的方法来定位和修改网页数据。本文将详细...
2. **网页内容提取**:在上述代码中,`SGMLParser`是Python标准库`sgmllib`的一部分,用于解析HTML或SGML文档。`Html2txt`类是自定义的解析器,通过重写`handle_data`方法来处理HTML中的文本内容。`start_head`和`...
Scrapy是一个强大的Python爬虫框架,适用于构建复杂的爬虫项目,能够快速地从网页中抓取所需信息。在这个特定的案例中,该工具主要针对淘宝网站,用于获取与特定关键字相关的商品数据。 首先,我们要了解Python在...
本项目"python抓取淘宝天猫网页商品详情Demo.zip"是一个利用Python进行网络数据抓取的示例,主要涉及到以下几个核心知识点: 1. **网络请求库**:在Python中,我们通常使用如`requests`库来发送HTTP请求,获取网页...
一个简化的示例,使用Python的requests库来抓取网页内容,并使用BeautifulSoup库来解析HTML 遵守robots.txt:在编写爬虫时,请确保你遵守目标网站的robots.txt文件规定。 不要过度请求:避免在短时间内发送大量请求...
本实例程序"python抓取网页到本地"将教你如何利用Python来抓取新闻页面上的所有新闻链接,并将这些链接对应的内容保存到本地。这涉及到的知识点主要包括Python基础、网络请求、HTML解析以及文件操作。 首先,我们...
3. **使用`BeautifulSoup`转换编码**:`BeautifulSoup`是一个强大的HTML解析库,它可以接受一个`from_encoding`参数,将原始内容转换为指定编码。在例子中,当实际编码和声明编码不一致时,使用`BeautifulSoup...
下面我们将通过一个具体的例子来了解如何使用Phantomjs结合Python进行网页抓取。 #### 三、Phantomjs代理设置 在具体实现过程中,首先需要配置一个Phantomjs的代理服务。这通常涉及到以下几个步骤: 1. **下载并...
Scrapely是一个基于Python的轻量级HTML解析库,它专为网页抓取而设计。在Web爬虫领域,Scrapely提供了一种简洁的方法来提取和解析网页中的数据,无需依赖大型框架如BeautifulSoup或lxml。这个库的独特之处在于它的...
在IT领域,HTML网页内容抓取是一项常见的任务,...总之,“html网页内容抓取”是一个涵盖网络编程、数据处理、网页解析等多个方面的技术领域,理解和掌握这些知识能够帮助我们从互联网的海量信息中提取有价值的数据。