首页 > 解决方案 > lxml 源代码行返回无

问题描述

使用beautifulsoup和lxml解析时需要获取xml的行号。

xml 缺少根标记,因此无法直接使用 XML 元素树/lxml。所以用beautifulsoup刮掉它。需要在嵌套字典中保留 xml 的文件名、行号、xml 标记及其值。尝试使用 beautifulsoup/lxml 抓取时无法获取行号。print(linenum)返回None但需要在 xml 文件中返回行号。有任何想法吗?

for xml_file in os.listdir("/Users/abc/Documents/test"):
    mode_map = defaultdict(list)       
    with open("/Users/abc/test/"+xml_file) as raw_resuls:    

        results = BeautifulSoup(raw_resuls, 'lxml')            

        for element in results.find_all("process"):
            attrib = element['mode']                
            if element.find("value") is not None:    
                child = element.find("value").text                    
                linenum= element.find("value").sourceline                    
                print(linenum)                    
                mode_map[attrib].append(child)                    


               # print(mode_map)

        event_map["process"]=mode_map    
        file_map[xml_file]=event_map

标签: pythonbeautifulsouplxml

解决方案


这对我有用!

with open("/Users/abc/Documents/test/"+xml_file) as fin:

        raw_xml = fin.read()

        new_xml="<root>" + raw_xml + "</root>"

        some_file_like = BytesIO(new_xml.encode())

        for event, element in etree.iterparse(some_file_like):
            if element.tag == 'process':
                attrib = element.attrib['mode']
                #print(attrib)
                if element.find("value") is not None:

                    child = element.find("value").text
                    linenum= element.find("value").sourceline
                    print(linenum)

推荐阅读