Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,使用正则表达式在文件中搜索html标记_Python_Html_Regex - Fatal编程技术网

Python,使用正则表达式在文件中搜索html标记

Python,使用正则表达式在文件中搜索html标记,python,html,regex,Python,Html,Regex,因此,我正在做一些数据分析,需要从数百个HTML和SHTML文件中提取页面标题、面包屑、h1标记 这些标签的格式如下(表示里面的东西和面包屑): 映射驱动器:Macintosh OSX映射驱动器eHelp Cal Pomona "&拉阔;MacOSX 映射驱动器:Macintosh OS X 在获得这些标记之后,我想进一步提取标题的第一部分映射驱动器:Macintosh OSX,面包屑的最后一部分,MacOS X,以及整个h1映射驱动器:Macintosh OSX 知道如何实现吗?使用真正的H

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

这些标签的格式如下(表示里面的东西和面包屑):

映射驱动器:Macintosh OSX映射驱动器eHelp Cal Pomona "&拉阔;MacOSX

映射驱动器:Macintosh OS X 在获得这些标记之后,我想进一步提取标题的第一部分映射驱动器:Macintosh OSX,面包屑的最后一部分,MacOS X,以及整个h1映射驱动器:Macintosh OSX


知道如何实现吗?

使用真正的HTML解析器,而不是正则表达式。你会更快乐
lxml.html
受到高度重视,就像
BeautifulSoup

一样,因为大多数html基本上都是xml(或者可以很容易地修剪以与大多数xml解析器兼容),我建议使用xml解析器。无论如何,大多数特定于python HTML的解析器只是xml解析器的子类

签出:

这里有一个很好的教程:

而且,这本书对我个人来说非常有用

这里解释了另一种类似的方法:

这是一个很好的例子:

import xml.dom.minidom
document=”“”\
演示幻灯片
幻灯片标题
这是一个演示
一种处理幻灯片的程序
另一张演示幻灯片
这很重要
不止
一张幻灯片
"""
dom=xml.dom.minidom.parseString(文档)
def getText(节点列表):
rc=[]
对于节点列表中的节点:
如果node.nodeType==node.TEXT\u节点:
rc.append(node.data)
返回“”。加入(rc)
def handleSlideshow(幻灯片放映):
打印“”
handleSlideshowTitle(slideshow.getElementsByTagName(“标题”)[0])
幻灯片=幻灯片放映。getElementsByTagName(“幻灯片”)
handleToc(幻灯片)
扶手滑梯(幻灯片)
打印“”
def手柄滑块(幻灯片):
对于滑入式幻灯片:
扶手滑道(滑道)
def手柄滑块(滑块):
handleSlideTitle(slide.getElementsByTagName(“标题”)[0])
handlePoints(slide.getElementsByTagName(“点”))
def handleSlideshowTitle(标题):
打印“%s”%getText(title.childNodes)
def handleSlideTitle(标题):
打印“%s”%getText(title.childNodes)
def手点(点):
打印“
    ” 对于点到点: 手点(点) 打印“
” def手点(点): 打印“
  • %s
  • %getText(point.childNodes) def handleToc(幻灯片): 对于滑入式幻灯片: title=slide.getElementsByTagName(“title”)[0] 打印“%s

    %getText(title.childNodes) handleSlideshow(dom)
    如果您必须使用正则表达式而不是解析器,请查看:

    [1]中的
    :导入re
    
    在[2]:grps=re.search(r“]+)>([^html5lib是一个非常可靠的html解析器。因为您的xhtml是,xml解析器会拒绝它。幸运的是,它有,所以您仍然可以使用lxml和xpath的全部功能来提取数据。

    关于使用正则表达式解析html的问题每天都会弹出。如果您还没有阅读:-)@“这是一个比喻,用来告诉你你是如何到达那里的,这样你就不会迷路了。”乔恩比喻≠ metaphor@tchrist:这是一条从网站根目录开始的路径,告诉您如何进入您正在查看的页面。类似于
    amazon>electronics>game console>PS3
    @chown,这不是因为我们使用的是英语。stackexchange或其他语言,而是您链接到的来源说明喻使用了“like”一词“或类似内容。您对面包屑的描述没有使用任何类似的内容。这不是一个明喻。不幸的是,这不适用于在wild web上找到的html。现在的大多数页面在xml解析器眼中都是有效的。如果不是,您可以轻松地将xml解析器分为子类,或
    ”。替换()
    不有效的部分。”(假设无效的是静态的)。
    <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>
    
    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)
    
    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')