簡體   English   中英

Python,使用正則表達式在文件中搜索html標簽

[英]Python, search for html tags inside a file using regex

所以我正在做一些數據分析,我需要從數百個HTML和SHTML文件中提取頁面標題,痕跡,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最后一部分和整個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')

html5lib是一個非常可靠的html解析器。 由於你的xhtml 有點壞了 ,xml解析器會拒絕它。 幸運的是, html5lib具有lxml集成 ,因此您仍然可以使用lxml和xpath的全部功能來提取數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM