我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python中如何解析HTML

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python中如何解析HTML

本篇文章给大家分享的是有关Python中如何解析HTML,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

这是一个典型的图像标签:

<img class="lazy" data-src="images/edit_shapes.png" ALT="Edit examples" ALIGN=left>

我对 class="lazy" data-src= 之后的***组引号之间的部分很感兴趣。 在寻找了一些解决方案后,我找到一个名为 BeautifulSoup 的 Python 模块。 脚本的核心部分如下所示:

soup = BeautifulSoup(all_text, 'html.parser')match = soup.findAll("img")if len(match) > 0:    for m in match:        imagelist.append(str(m))

我们可以使用这个 findAll 方法来挖出图片标签。 这是一小部分输出:

<img class="lazy" data-src="images/pdf-form-ht3.png"/><img class="lazy" data-src="images/pdf-form-ht4.png"/><img class="lazy" data-src="images/pdf-form-ht5.png"/><img class="lazy" data-src="images/pdf-form-ht6.png"/><img align="middle" alt="GSview - Advanced Options Panel" class="lazy" data-src="images/gsadv1.png" title="GSview - Advanced Options Panel"/><img align="middle" alt="Scribus External Tools Preferences" class="lazy" data-src="images/gsadv2.png" title="Scribus External Tools Preferences"/>

到现在为止还挺好。我原以为下一步就可以搞定了,但是当我在脚本中尝试了一些字符串方法时,它返回了有关标记的错误而不是字符串的错误。 我将输出保存到一个文件中,并在 KWrite 中进行编辑。 KWrite 的一个好处是你可以使用正则表达式(regex)来做“查找和替换”操作,所以我可以用 \n<img 替换 <img,这样可以看得更清楚。 KWrite 的另一个好处是,如果你用正则表达式做了一个不明智的选择,你还可以撤消。

但我认为,肯定有比这更好的东西,所以我转而使用正则表达式,或者更具体地说 Python 的 re 模块。 这个新脚本的相关部分如下所示:

match = re.findall(r'class="lazy" data-src="(.*)/>', all_text)if len(match)>0:    for m in match:        imagelist.append(m)

它的一小部分输出如下所示:

images/cmcanvas.png" title="Context Menu for the document canvas" alt="Context Menu for the document canvas" /></td></tr></table><br images/eps-imp1.png" title="EPS preview in a file dialog" alt="EPS preview in a file dialog" images/eps-imp5.png" title="Colors imported from an EPS file" alt="Colors imported from an EPS file" images/eps-imp4.png" title="EPS font substitution" alt="EPS font substitution" images/eps-imp2.png" title="EPS import progress" alt="EPS import progress" images/eps-imp3.png" title="Bitmap conversion failure" alt="Bitmap conversion failure"

乍一看,它看起来与上面的输出类似,并且附带有去除图像的标签部分的好处,但是有令人费解的是还夹杂着表格标签和其他内容。 我认为这涉及到这个正则表达式 class="lazy" data-src="(.*)/>,这被称为贪婪,意味着它不一定停止在遇到 /> 的***个实例。我应该补充一点,我也尝试过 class="lazy" data-src="(.*)",这真的没有什么更好的效果,我不是一个正则表达式专家(只是做了这个),找了各种方法来改进这一点但是并没什么用。

做了一系列的事情之后,甚至尝试了 Perl 的 HTML::Parser 模块,最终我试图将这与我为 Scribus 编写的一些脚本进行比较,这些脚本逐个字符的分析文本内容,然后采取一些行动。 为了最终目的,我终于想出了所有这些方法,并且完全不需要正则表达式或 HTML 解析器。 让我们回到展示的那个 img 标签的例子。

<img class="lazy" data-src="images/edit_shapes.png" ALT="Edit examples" ALIGN=left>

我决定回到 class="lazy" data-src= 这一块。 一种方法是等待 s 出现,然后看下一个字符是否是 r,下一个是 c,下一个是否 =。 如果是这样,那就匹配上了! 那么两个双引号之间的内容就是我所需要的。 这种方法的问题在于需要连续识别上面这样的结构。 一种查看代表一行 HTML 文本的字符串的方法是:

for c in all_text:

但是这个逻辑太乱了,以至于不能持续匹配到前面的 c,还有之前的字符,更之前的字符,更更之前的字符。

***,我决定专注于 = 并使用索引方法,以便我可以轻松地引用字符串中的任何先前或将来的字符。 这里是搜索部分:

    index = 3    while index < linelength:        if (all_text[index] == '='):            if (all_text[index-3] == 's') and (all_text[index-2] == 'r') and (all_text[index-1] == 'c'):                imagefound(all_text, imagelist, index)                index += 1            else:                index += 1        else:            index += 1

我用第四个字符开始搜索(索引从 0 开始),所以我在下面没有出现索引错误,并且实际上,在每一行的第四个字符之前不会有等号。 ***个测试是看字符串中是否出现了 =,如果没有,我们就会前进。 如果我们确实看到一个等号,那么我们会看前三个字符是否是 src。 如果全都匹配了,就调用函数 imagefound

def imagefound(all_text, imagelist, index):    end = 0    index += 2    newimage = ''    while end == 0:        if (all_text[index] != '"'):            newimage = newimage + all_text[index]            index += 1        else:            newimage = newimage + '\n'            imagelist.append(newimage)            end = 1            return

我们给函数发送当前索引,它代表着 =。 我们知道下一个字符将会是 ",所以我们跳过两个字符,并开始向名为 newimage 的控制字符串添加字符,直到我们发现下一个 ",此时我们完成了一次匹配。 我们将字符串加一个换行符(\n)添加到列表 imagelist 中并返回(return),请记住,在剩余的这个 HTML 字符串中可能会有更多图片标签,所以我们马上回到搜索循环中。

以下是我们的输出现在的样子:

images/text-frame-link.pngimages/text-frame-unlink.pngimages/gimpoptions1.pngimages/gimpoptions3.pngimages/gimpoptions2.pngimages/fontpref3.pngimages/font-subst.pngimages/fontpref2.pngimages/fontpref1.pngimages/dtp-studio.png

啊,干净多了,而这只花费几秒钟的时间。 我本可以将索引前移 7 步来剪切 images/ 部分,但我更愿意把这个部分保存下来,以确保我没有剪切掉图像文件名的***个字母,这很容易用 KWrite 编辑成功 &mdash;&mdash; 你甚至不需要正则表达式。 做完这些并保存文件后,下一步就是运行我编写的另一个脚本 sortlist.py

#!/usr/bin/env python# -*- coding: utf-8  -*-# sortlist.py import os imagelist = []for line in open('/tmp/imagelist_parse4.txt').xreadlines():    imagelist.append(line) imagelist.sort() outfile = open('/tmp/imagelist_parse4_sorted.txt', 'w')outfile.writelines(imagelist)outfile.close()

这会读取文件内容,并存储为列表,对其排序,然后另存为另一个文件。 之后,我可以做到以下几点:

ls /home/gregp/development/Scribus15x/doc/en/images/*.png > '/tmp/actual_images.txt'

然后我需要在该文件上运行 sortlist.py,因为 ls 方法的排序与 Python 不同。 我原本可以在这些文件上运行比较脚本,但我更愿意以可视方式进行操作。 ***,我成功找到了 42 个图像,这些图像没有来自文档的 HTML 引用。

这是我的完整解析脚本:

#!/usr/bin/env python# -*- coding: utf-8  -*-# parseimg4.py import os def imagefound(all_text, imagelist, index):    end = 0    index += 2    newimage = ''    while end == 0:        if (all_text[index] != '"'):            newimage = newimage + all_text[index]            index += 1        else:            newimage = newimage + '\n'            imagelist.append(newimage)            end = 1            return htmlnames = []imagelist = []tempstring = ''filenames = os.listdir('/home/gregp/development/Scribus15x/doc/en/')for name in filenames:    if name.endswith('.html'):        htmlnames.append(name)#print htmlnamesfor htmlfile in htmlnames:    all_text = open('/home/gregp/development/Scribus15x/doc/en/' + htmlfile).read()    linelength = len(all_text)    index = 3    while index < linelength:        if (all_text[index] == '='):            if (all_text[index-3] == 's') and (all_text[index-2] == 'r') and(all_text[index-1] == 'c'):                imagefound(all_text, imagelist, index)                index += 1            else:                index += 1        else:            index += 1 outfile = open('/tmp/imagelist_parse4.txt', 'w')outfile.writelines(imagelist)outfile.close()imageno = len(imagelist)print str(imageno) + " images were found and saved"

脚本名称为 parseimg4.py,这并不能真实反映我陆续编写的脚本数量(包括微调的和大改的以及丢弃并重新开始写的)。 请注意,我已经对这些目录和文件名进行了硬编码,但是很容易变得通用化,让用户输入这些信息。 同样,因为它们是工作脚本,所以我将输出发送到 /tmp 目录,所以一旦重新启动系统,它们就会消失。

这不是故事的结尾,因为下一个问题是:僵尸 HTML 文件怎么办? 任何未使用的文件都可能会引用图像,不能被前面的方法所找出。 我们有一个 menu.xml 文件作为联机手册的目录,但我还需要考虑 TOC(LCTT 译注:TOC 是 table of contents 的缩写)中列出的某些文件可能引用了不在 TOC 中的文件,是的,我确实找到了一些这样的文件。

以上就是Python中如何解析HTML,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python中如何解析HTML

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中如何解析HTML

本篇文章给大家分享的是有关Python中如何解析HTML,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。这是一个典型的图像标签:2023-06-17

Python中如何解析XML

Python中如何解析XML,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是XML?XML是可扩展标记语言(Extensible Markup Langua
2023-06-17

用python解析html[SGMLPa

因为要用python做学校网络的认证程序,需要解析服务器传回的html,本以为会像javascript里操作DOM那样简单,结果发现并不是 这样,被搞了一下。其实python里面有xml.dom模块,但是这次却不能用,为啥呢?因为服务器传回
2023-01-31

vbs如何解析html文档

这篇文章给大家分享的是有关vbs如何解析html文档的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。关于VBS采集,网上流行比较多的方法都是正则,其实 htmlfile 可以解析 html 代码,但如果 desig
2023-06-08

如何在python中解析ElementTree

这篇文章将为大家详细讲解有关如何在python中解析ElementTree,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python主要应用领域有哪些1、云计算,典型应用OpenStack。
2023-06-14

python简单的HTML解析

# coding:utf-8# 引入相关模块import jsonimport requestsfrom bs4 import BeautifulSoupurl = "http://news.qq.com/"# 请求腾讯新闻的URL,获取其
2023-01-31

利用python来解析html

引子使用python来进行抓取网页的时候,可以使用HTMLParser来解析html文档,本次就看看这个玩意怎么用实战源码获取方法请看视频地址:http://v.youku.com/v_show/id_XMzEyMzA0MTM5Mg==.h
2023-01-31

如何用PythonBeautiful Soup解析HTML内容

BeautifulSoup是一种Python的解析库,主要用于解析和处理HTML/XML内容,详细介绍BeautifulSoup的使用方式和应用场景,本文给大家介绍的非常详细,需要的朋友可以参考下
2023-05-20

如何在python中解析json文件

本篇文章为大家展示了如何在python中解析json文件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能
2023-06-14

分析如何在Python中解析和修改XML

目录一、什么是XML?二、Python XML解析模块2.1、xml.etree.ElementTree模块2.2、xml.dom.minidom模块一、什么是XML? XML代表可扩展标记语言。它在外观上类似于HTML,但XML用于数据表
2022-06-02

如何使用xpath解析html字符串

一分耕耘,一分收获!既然打开了这篇文章《如何使用xpath解析html字符串》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!
如何使用xpath解析html字符串
2024-04-04

如何解决php不解析html标签问题

这篇文章主要讲解了“如何解决php不解析html标签问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决php不解析html标签问题”吧!php不解析html标签的解决办法:1、用PH
2023-06-20

Python爬虫之解析HTML页面详解

本文介绍了Python中用于解析HTML页面的重要工具之一——BeautifulSoup库,详细讲解了BeautifulSoup库的基本使用方法、标签选择器、CSS选择器、正则表达式、遍历文档树等内容,并结合实例代码展示了BeautifulSoup库的应用场景
2023-05-18

C#如何使用AngleSharp库解析html文档

这篇“C#如何使用AngleSharp库解析html文档”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#如何使用Angle
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录