在python中,如何读取文件的一部分(解析),中断“<”字符?

2024-09-27 00:17:16 发布

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

我需要用python解析html文件,并将内容存储在一个列表中。 示例:['<html>', '<head>', '<meta name="robots" content="noindex">']

下面是关于buggis函数的内容:

def getTexte(fp,compte=0): #returns the text before a html tag
    txt=""
    pos=fp.tell() #stock the curr position for later use
    tmppos=fp.tell() #same here
    for car in fp.read():
        if car=="<": #if we encounter the start of a html tag
            fp.seek(tmppos) #we get back to juste before the html tag
            break # and we leave this damn for
        txt=txt+car #we concatenate each car in the string
        tmppos=fp.tell() #and stock the pos for later use
    if compte==0:
        fp.seek(pos)
    if txt!="":
        return txt

下面是我得到的一个示例输出:

^{pr2}$

我不明白为什么。可能太累了。在


Tags: thepostxt示例内容forifhtml
2条回答

如果您只需要使用已解析的html的输出,那么看看Beautiful Soup。确保HTML(和XML)被正确解析已经花费了大量的工作,即使您给它输入无效的标记也是如此。在

你需要构建一个解析器吗?或者只需要使用解析器的输出?这将决定从StackOverflow获得的帮助类型。很多时候,通过将您的意图(需求)与您提出的解决方案和问题放在一起,人们会指出可能更适合您需求的替代解决方案。值得深思。在

正如其他人在他们的评论中所说的,你真的不想通过迭代输入作为一系列字符来编写HTML解析器。您的代码片段对tell()read()方法的引用表明,您是从遍历打开的文件的角度来考虑这一点的,而不是从更高的层次(将文档作为字符串读入缓冲区)来考虑这一点。在

有许多工具已经编写,免费提供,广泛测试,良好的维护和广泛赞誉,它们是专门为您执行这类任务而设计的。到目前为止,其中最受欢迎的是一个名为“beauthoulsoup”的程序,它以其健壮性和对“真实世界”中的HTML的容忍度而闻名。beauthulsoup的目标大致上是解析浏览器可以合理显示的任何HTML。因此,它可以处理HTML中各种极为常见的错误——嵌套不当的标记、缺少结束标记的容器、非标准的“标记”以及具有非标准和格式错误的属性和属性=值对的标记等等。在

下面是一个非常简单的使用BeautifulGroup的Python代码示例:

#!/bin/env python

import urllib2
from BeautifulSoup import BeautifulSoup 

def get_page(url):
    fetcher = urllib2.urlopen(url)
    results = fetcher.read()
    fetcher.close()
    return results

def find_tags(data):
    results = list()
    parser = BeautifulSoup(data)
    results.extend(parser.findAll())
    return results

if __name__ == '__main__':
    import sys, time

    for url in sys.argv[1:]:
        html=get_page(url)
        for n, each in enumerate([str(x) for x in find_tags(html)]):
            print n, each, '\n\n\n'

。。。如你所见,对BeautifulSoup的引用只占了这里的几行。剩下的就是获取HTML并打印结果。在

顺便说一句,这些结果并不是您所要寻找的,因为它们表示从最外层向下遍历每个HTML容器及其组件,然后再遍历及其组件,在你的代码中,你可能需要遍历这棵树,确定你什么时候在叶子上,然后以某种方式捕捉文本/内容或标记/代码。您需要阅读BeautifulSoup: Documentation,以获得更精确地满足您的需求的详细信息。在

相关问题 更多 >

    热门问题