使用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
答案 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)