[英]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.