python - 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
解决方案
这对我有用!
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)
推荐阅读
- python - 如何在每一步将迭代解决方案的输出调用到数组中(使用 Python)
- laravel - Laravel 急切加载在相反的关系中不起作用
- embedded-linux - Yocto、OpenEmbedded、Poky... 健全性检查
- java - 将 mouseUp 和 mouseDoubleClick 与菜单一起使用
- python - 实现一个关注系统并获取用户在 django 中关注的人的帖子
- python - Django 在媒体文件夹中创建另一个媒体文件夹
- android - 为后续请求保留证书
- c++ - c++17: 至少必须替换哪些版本的全局运算符 new/delete 才能涵盖所有情况?
- vb.net - SQLite DB 中的第二条记录未更新
- node.js - node-rsa:不需要导入公钥?