【发布时间】:2019-06-25 00:40:32
【问题描述】:
使用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
【问题讨论】:
-
BeautifulSoup 元素没有名为“sourceline”的属性。您的
linenum变为None而不是引发AttributeError的原因是BeautifulSoup 元素还允许您使用element.process之类的语法而不是element.findChild('process')按名称查找孩子,其中None作为故障保护.我个人不喜欢这样:在很多情况下可能很方便,但感觉迟早你会无意中碰到 BeautifulSoup 元素的现有属性。 -
既然lxml有你想要的特性,而BeautifulSoup没有,那为什么不直接使用lxml呢?如果 xml 的所有问题在于它“缺少根标记”,那么您至少可以自己打一个根标记。
标签: python beautifulsoup lxml