Python,使用正则表达式在文件中搜索html标记
因此,我正在做一些数据分析,需要从数百个HTML和SHTML文件中提取页面标题、面包屑、h1标记 这些标签的格式如下(表示里面的东西和面包屑): 映射驱动器:Macintosh OSX映射驱动器eHelp Cal Pomona "&拉阔;MacOSX 映射驱动器:Macintosh OS X 在获得这些标记之后,我想进一步提取标题的第一部分映射驱动器:Macintosh OSX,面包屑的最后一部分,MacOS X,以及整个h1映射驱动器:Macintosh OSXPython,使用正则表达式在文件中搜索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解析器,而不是正则表达式。你会更快乐
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 < 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>
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')