[英]Python, search for html tags inside a file using regex
所以我正在做一些數據分析,我需要從數百個HTML和SHTML文件中提取頁面標題,痕跡,h1標簽。
這些標簽采用以下格式(意思是內容和面包屑):
<title>Mapping a Drive: Macintosh OSX < Mapping a Drive < eHelp < Cal Poly Pomona</title>
<p><!-- InstanceBeginEditable name="breadcrumb" --><a href="../index.html">eHelp</a> » <a href="index.shtml">Mapping a Drive</a> » Mac OS X<!-- InstanceEndEditable --></p>
<h1><a name="contentstart" id="contentstart"></a><!-- InstanceBeginEditable name="page_heading" --><a name="top" id="top"></a>Mapping a Drive:<span class="goldletter"> Macintosh </span>OS X <!-- InstanceEndEditable --></h1>
獲得這些標簽后,我想進一步提取標題的第一部分Mapping a Drive: Macintosh OSX
,面包屑Mac OS X
最后一部分和整個h1 Mapping a Drive: Macintosh OSX
知道如何實現這一點嗎?
使用真正的HTML解析器,而不是正則表達式。 你會更快樂。 lxml.html
受到高度重視, BeautifulSoup
。
由於大多數HTML基本上是xml(或者可以很容易地修剪為與大多數xml解析器兼容),我建議使用xml解析器。 大多數python HTML特定的解析器無論如何都只是xml解析器的子類。
查看: Python和XML 。
這是一個很好的教程: Python XML Parser Tutorial 。
此外, xml.dom.minidom類對我個人來說非常有用。
這里解釋了另一種類似的方法: xml.etree.ElementTree 。
這是xml.dom.minidom參考頁面的一個很好的例子:
import xml.dom.minidom
document = """\
<slideshow>
<title>Demo slideshow</title>
<slide><title>Slide title</title>
<point>This is a demo</point>
<point>Of a program for processing slides</point>
</slide>
<slide><title>Another demo slide</title>
<point>It is important</point>
<point>To have more than</point>
<point>one slide</point>
</slide>
</slideshow>
"""
dom = xml.dom.minidom.parseString(document)
def getText(nodelist):
rc = []
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc.append(node.data)
return ''.join(rc)
def handleSlideshow(slideshow):
print "<html>"
handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])
slides = slideshow.getElementsByTagName("slide")
handleToc(slides)
handleSlides(slides)
print "</html>"
def handleSlides(slides):
for slide in slides:
handleSlide(slide)
def handleSlide(slide):
handleSlideTitle(slide.getElementsByTagName("title")[0])
handlePoints(slide.getElementsByTagName("point"))
def handleSlideshowTitle(title):
print "<title>%s</title>" % getText(title.childNodes)
def handleSlideTitle(title):
print "<h2>%s</h2>" % getText(title.childNodes)
def handlePoints(points):
print "<ul>"
for point in points:
handlePoint(point)
print "</ul>"
def handlePoint(point):
print "<li>%s</li>" % getText(point.childNodes)
def handleToc(slides):
for slide in slides:
title = slide.getElementsByTagName("title")[0]
print "<p>%s</p>" % getText(title.childNodes)
handleSlideshow(dom)
如果你絕對必須使用正則表達式而不是解析器,請查看re模塊 :
In [1]: import re
In [2]: grps = re.search(r"<([^>]+)>([^<]+)</\1>", "<abc>123</abc>")
In [3]: if grps:
In [4]: print grps.groups()
Out[3]: ('abc', '123')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.