当前位置: 首页 > 科技观察

如何用Python解析HTML?

时间:2023-03-18 18:35:18 科技观察

通过一些简单的脚本,可以轻松清理文档和其他大型HTML文件。但首先你需要解析它们。作为Scribus文档团队的长期成员,我随时了解最新的源代码更新,以便更新和补充文档。当我最近在一台刚刚升级到Fedora27系统的计算机上使用Subversion进行检查时,我对下载由HTML页面和相关图像组成的文档所花费的时间感到惊讶。恐怕该项目的文档看起来比项目本身大得多,并且怀疑其中的一些内容是“僵尸”文档——不再使用的HTML文件和无法在HTML中访问的图像。我决定为自己创建一个项目来解决这个问题。一种方法是搜索未使用的现有图像文件。如果我可以扫描所有HTML文件以查找图像参考并将该列表与实际图像文件进行比较,那么我可能会看到不匹配的文件。这是一个典型的图像标签:我对src=之后的***引号集之间的部分感兴趣。在搜索了一些解决方案之后,我找到了一个名为BeautifulSoup的Python模块。脚本的核心如下所示:soup=BeautifulSoup(all_text,'html.parser')match=soup.findAll("img")iflen(match)>0:forminmatch:imagelist.append(str(m))我们可以使用这个findAll方法来挖掘图片标签。这是输出的一个小样本:到目前为止还不错好的。我以为下一步就可以解决问题,但是当我尝试脚本中的某些字符串方法时,它返回有关标签而不是字符串的错误。我将输出保存到一个文件并在KWrite中编辑它。KWrite的一个好处是您可以使用正则表达式(regex)执行“查找和替换”操作,因此我可以将',all_text)iflen(match)>0:forminmatch:imagelist.append(m)它的一小部分输出如下所示:images/cmcanvas.png"title="文档画布的上下文菜单"alt="文档画布的上下文菜单"/>我决定回到src=块。一种方法是等待s出现,然后看下一个字符是不是r,下一个c,再下一个=。如果是,则匹配OK!然后是两个双引号之间的内容es是我需要的。这种方法的问题是需要连续识别上面的结构。一种查看代表一行HTML文本的字符串的方法是:forcinall_text:但是这个逻辑太乱了,一直匹配到前面的c,和之前的字符,和之前的字符,和之前的字符。***,我决定把重点放在=上,并使用索引方法,这样我就可以轻松地引用字符串中任何之前或之后的字符。这是搜索部分:index=3whileindex'/tmp/actual_images.txt'然后我需要在该文件上运行sortlist.py,因为ls方法的排序方式与Python不同。我本可以对这些文件运行比较脚本,但我更愿意以可视化方式进行。***,我设法从文档中找到了42张没有HTML引用的图像。这是我的完整解析脚本:#!/usr/bin/envpython#-*-coding:utf-8-*-#parseimg4.pyimportosdefimagefound(all_text,imagelist,index):end=0index+=2newimage=''whileend==0:if(all_text[index]!='"'):newimage=newimage+all_text[index]index+=1else:newimage=newimage+'\n'imagelist.append(newimage)end=1returnhtmlnames=[]imagelist=[]tempstring=''filenames=os.listdir('/home/gregp/development/Scribus15x/doc/en/')fornameinfilenames:ifname.endswith('.html'):htmlnames.append(name)#printhtmlnamesforhtmlfileinhtmlnames:all_text=open('/home/gregp/development/Scribus15x/doc/en/'+htmlfile).read()linelength=len(all_text)索引=3whileindex