2016-02-29 37 views
3

我想比较文本在两个XML文件中的特定标记的所有实例。我使用的OCR引擎输出一个带有标记<OCRCharacters>...</OCRCharacters>中所有ocr字符的xml文件。使用差异与美丽的汤对象

我使用python 2.7.11和美丽的汤4(bs4)。在终端中,我用两个xml文件名作为参数调用我的python程序。

我想提取每个文件的<OCRCharacters>标记中的所有字符串,将它们逐行与difflib进行比较,然后编写一个具有差异的新文件。我使用$ python parse_xml_file.py file1.xml file2.xml从终端调用程序。

下面的代码打开每个文件并打印标签<OCRCharacters>中的每个字符串。我应该如何将使用bs4制作的对象转换为可与difflib一起使用的字符串。我打开更好的方式(使用python)来做到这一点。

import sys 

with open(sys.argv[1], "r") as f1: 
    xml_doc_1 = f1.read() 

with open(sys.argv[2], "r") as f2: 
    xml_doc_2 = f2.read() 

from bs4 import BeautifulSoup 
soup1 = BeautifulSoup(xml_doc_1, 'xml') 
soup2 = BeautifulSoup(xml_doc_2, 'xml') 

print("#####################",sys.argv[1],"#####################") 
for tag in soup1.find_all('OCRCharacters'): 
    print(repr(tag.string)) 
    temp1 = repr(tag.string) 
    print(temp1) 
print("#####################",sys.argv[2],"#####################")  
for tag in soup2.find_all('OCRCharacters'): 
    print(repr(tag.string)) 
    temp2 = repr(tag.string) 

回答

1

你可以试试这个:

import sys 
import difflib 
from bs4 import BeautifulSoup 

text = [[],[]] 
files = [] 
soups = [] 

for i, arg in enumerate(sys.argv[1:]): 
    files.append(open(arg, "r").read()) 
    soups.append(BeautifulSoup(files[i], 'xml')) 

    for tag_text in soups[i].find_all('OCRCharacters'): 
    text[i].append(''.join(tag_text)) 

for first_string, second_string in zip(text[0], text[1]): 
    d = difflib.Differ() 
    diff = d.compare(first_string.splitlines(), second_string.splitlines()) 
    print '\n'.join(diff) 

随着xml1.xml:

<node> 
    <OCRCharacters>text1_1</OCRCharacters> 
    <OCRCharacters>text1_2</OCRCharacters> 
    <OCRCharacters>Same Value</OCRCharacters> 
</node> 

和xml2.xml:

<node> 
    <OCRCharacters>text2_1</OCRCharacters> 
    <OCRCharacters>text2_2</OCRCharacters> 
    <OCRCharacters>Same Value</OCRCharacters> 
</node> 

输出将是:

- text1_1 
? ^

+ text2_1 
? ^

- text1_2 
? ^

+ text2_2 
? ^

    Same Value