【发布时间】:2021-10-24 13:00:18
【问题描述】:
我想使用 dateparser 库从 OCR 图像中提取日期。
import dateparser
data = []
listOfPages = glob.glob(r"C:/Users/name/folder/test/*.tif")
for entry in listOfPages:
text1 = pytesseract.image_to_string(
Image.open(entry), lang="deu"
)
text = re.sub(r'\n',' ', text1)
date1 = re.compile(r'(Dresden(\.|,|\s+)?)(.*)', flags = re.DOTALL | re.MULTILINE)
date = date1.search(text)
if date:
dates = dateparser.parse(date.group(3), date_formats=['%d %m %Y'], languages=['de'], settings={'STRICT_PARSING': True})
else:
dates = None
if dates == None:
dates = dateparser.parse(date.group(3), date_formats=['%d %B %Y'], locale = 'de', settings={'STRICT_PARSING': True})
else:
dates = None
data.append([text, dates])
df0 = pd.DataFrame(data, columns =['raw_text', 'dates'])
print(df0)
为什么会出现错误:NameError: name 'dates' is not defined
更新:TypeError: Input type must be str
【问题讨论】:
-
将错误的完整回溯显示为问题中格式正确的文本。
-
您正在使用
except: pass抑制错误。分配给dates之前的某行抛出异常,因此分配永远不会发生,因此名称永远不会被定义。这就是为什么你不应该压制错误。将pass更改为raise或print()调用或两者兼而有之以查找错误。 -
感谢 BoarGules 的提醒。现在错误是
TypeError: Input type must be str,它指向date变量。我认为date1.search(text)的结果将是一个字符串还是正则表达式跨度对象的东西? -
首先
(City(\.|,|\s+)?)(.*)不匹配,见this regex demo。date是匹配数据对象,而不是字符串,但您将其作为第一个参数传递给dateparser.parse,您需要使用dateparser.parse(date.group(3),因为您希望将值捕获到(.*)中。此外,dateparser.parse(text, date_formats=['%d %m %Y'], languages=['de'], settings={'STRICT_PARSING': True})没有找到任何东西。实际的文字是什么?另外,请注意,您根本不需要在这里尝试 excet。 -
谢谢,维克托!如果我不
try:except我得到错误:AttributeError: 'NoneType' object has no attribute 'group'。如果我保留它,它不会再给我任何错误,但也会将所有dates值返回为None。.group(3)是正确的,根据regex101.com/r/ah5b03/1
标签: python date-parsing dateparser