Python,使用regex在文件中搜索html标记

2024-10-02 18:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我正在做一些数据分析,其中我需要从数百个HTML和SHTML文件中提取页面标题、breadcrumb、h1标记。在

这些标记的格式如下(表示“内部填充”和“面包屑”):

<title>Mapping a Drive: Macintosh OSX &lt; Mapping a Drive &lt; eHelp &lt; Cal Poly Pomona</title>

<p><!-- InstanceBeginEditable name="breadcrumb" --><a href="../index.html">eHelp</a> &raquo; <a href="index.shtml">Mapping a Drive</a> &raquo; 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,以及整个h1Mapping a Drive: Macintosh OSX

你知道怎么做到吗?在


Tags: name标记lt标题titleosdriveh1
3条回答

由于大多数HTML基本上都是xml(或者可以很容易地进行裁剪以与大多数xml解析器兼容),所以我建议使用xml解析器。无论如何,python解析器只是一个特定于xml解析器的子类。在

退房:Python and XML。在

这里有一个很好的教程:Python XML Parser Tutorial。在

另外,xml.dom.minidom Class对我个人来说非常有用。在

另一个类似的方法解释如下:xml.etree.ElementTree。在

这是xml.dom.minidom reference page中的一个很好的例子:

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)

如果您绝对必须使用regex而不是解析器,请查看re module

^{pr2}$

使用真正的HTML解析器,而不是regex。你会更快乐。lxml.html和{}一样受到高度重视。在

html5lib是一个非常可靠的html解析器。由于xhtml是somewhat broken,xml解析器将拒绝它。幸运的是,html5lib有{a3},因此您仍然可以使用lxml和xpath的全部功能来提取数据。在

相关问题 更多 >