lxml源代码返回无

时间:2019-06-25 00:40:32

标签: python beautifulsoup lxml

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

该xml缺少根标记,因此无法直接使用XML元素tree / 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

2 个答案:

答案 0 :(得分:0)

由于找不到更好的东西,因此将其发布为答案。像您一样习惯from lxml import etree。然后,执行以下操作:

    with open("/Users/abc/test/"+xml_file) as fin:    
        raw_xml = fin.read()
        results = etree.XML('<root>' + raw_xml + '</root>')

我相信您知道下一步该怎么做,因为您似乎对lxml很熟悉。由于我添加的<root>...</root>标签对没有换行符,因此它们不应以任何方式影响您的sourceline

答案 1 :(得分:0)

这对我有用!

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)