从 docx 中提取文本作为键值对给出属性错误
Extracting text from docx as key value pair giving attribute error
我有一个如下所示的 Docx 文件
Requisition No: VOI9053459-
Job location: Melbourn
Exp : 2 – 4 Years
Notice period :-15day or less
其中包含其他详细信息。我想从文档中提取某些键值对并将其保存为字典。该文档已被提取并分配给
for child in parent_elm.iterchildren():
if isinstance(child, CT_P):
yield Paragraph(child, parent)
text = block.text
我目前的进度是
job_location = re.compile(r'(^Job?.*\S+?)')
notice_period = re.compile(r'(^Notice?.*\d\w*.+\S+?)')
experience = re.compile(r'(^Exp.*\S+?)')
job_location = job_location.search(text)
key_value1 = job_location.group()
split1 = re.split(': |-', key_value1)
keys.append(split1[0])
data.append(split1[1])
notice_period = notice_period.search(text)
key_value2 = notice_period.group()
split2 = re.split(': |-', key_value2)
keys.append(split2[0])
data.append(split2[1])
experience = experience.search(text)
key_value3 = experience.group()
split3 = re.split(': |-', key_value3)
keys.append(split3[0])
data.append(split3[1])
for key in keys:
col.append((key, []))
i = 0
for j in range(len(data)):
T = data[j]
col[i][1].append(T)
i += 1
Dict = {keys: data for (keys, data) in col}
print(Dict)
我收到属性错误
> AttributeError
Traceback (most recent call last) <ipython-input-261-84c60112ddb2> in <module>
> 82
> 83
> ---> 84 convert_docx_to_text(file_path=(r'data_extraction.docx'))
>
> <ipython-input-261-84c60112ddb2> in convert_docx_to_text(file_path)
> 51
> 52 job_location=job_location.search(text)
> ---> 53 key_value1=job_location.group()
> 54 split1=re.split(': |-',key_value1)
> 55 keys.append(split1[0])
>
> AttributeError: 'NoneType' object has no attribute 'group'
为什么不起作用?任何帮助表示赞赏。谢谢
当您获得此代码时,应该可以使用
编辑1改进代码,只拆分第一个巧合
split3=re.split(': |-',key_value3, 1)
#keys.append(split3[0])
#data.append(split3[1])
k,v = split3
your_dict[k] = v
注意这一行job_location = job_location.search(text)
,搜索不成功,因为job_location = None
,因此出现错误,你不会从None
得到任何东西,你要么需要更改 text
或使用 job_location
您的正则表达式有几个问题。让我们使用正则表达式来搜索工作地点。你有:
r'(^Job?.*\S+?)'
- 首先,如果不使用
flags=re.MULTILINE
,^
字符将只匹配字符串的开头,而不是一行的开头。
Job?
匹配 Jo
(可选) 后跟 b
.
- 在没有
flags=re.DOTALL
的情况下,.*
会贪心匹配任何非换行符0或更多次。
\S+?
将有选择地匹配 1 个或多个非白色 space 字符。
例如,您的正则表达式将匹配以下行:Joabcdefg
与 .*
匹配 abcdef
和 \S+?
匹配 g
.
您还调用了 match
对象的 group
方法。但是您必须向此方法传递一个整数,指定您感兴趣的组号。
搜索工作地点所需的正则表达式在以下示例中给出:
import re
text = """=Requisition No: VOI9053459-
Job location: Melbourn
Exp : 2 – 4 Years
Notice period :-15day or less"""
job_location_re = re.compile(r'(?:^Job\s+location:\s+)(.*)$', re.MULTILINE)
m = job_location_re.search(text)
if m: # there is a match
job_location = m.group(1)
print(job_location)
打印:
Melbourn
请注意,我调用了已编译的正则表达式 job_location_re
,而不是对正则表达式和位置名称都使用名称 job_location
。
(?^Job\s+location:\s+)
匹配行首的 Job location:
,允许 Job
和 location:
之间以及 [=33= 之后的一个或多个 space ].这是在 非捕获 组中完成的。
(.*)
匹配 greedily 直到行尾的任何非换行符。这将是第 1 组。
$
匹配行尾。
我有一个如下所示的 Docx 文件
Requisition No: VOI9053459-
Job location: Melbourn
Exp : 2 – 4 Years
Notice period :-15day or less
其中包含其他详细信息。我想从文档中提取某些键值对并将其保存为字典。该文档已被提取并分配给
for child in parent_elm.iterchildren():
if isinstance(child, CT_P):
yield Paragraph(child, parent)
text = block.text
我目前的进度是
job_location = re.compile(r'(^Job?.*\S+?)')
notice_period = re.compile(r'(^Notice?.*\d\w*.+\S+?)')
experience = re.compile(r'(^Exp.*\S+?)')
job_location = job_location.search(text)
key_value1 = job_location.group()
split1 = re.split(': |-', key_value1)
keys.append(split1[0])
data.append(split1[1])
notice_period = notice_period.search(text)
key_value2 = notice_period.group()
split2 = re.split(': |-', key_value2)
keys.append(split2[0])
data.append(split2[1])
experience = experience.search(text)
key_value3 = experience.group()
split3 = re.split(': |-', key_value3)
keys.append(split3[0])
data.append(split3[1])
for key in keys:
col.append((key, []))
i = 0
for j in range(len(data)):
T = data[j]
col[i][1].append(T)
i += 1
Dict = {keys: data for (keys, data) in col}
print(Dict)
我收到属性错误
> AttributeError
Traceback (most recent call last) <ipython-input-261-84c60112ddb2> in <module>
> 82
> 83
> ---> 84 convert_docx_to_text(file_path=(r'data_extraction.docx'))
>
> <ipython-input-261-84c60112ddb2> in convert_docx_to_text(file_path)
> 51
> 52 job_location=job_location.search(text)
> ---> 53 key_value1=job_location.group()
> 54 split1=re.split(': |-',key_value1)
> 55 keys.append(split1[0])
>
> AttributeError: 'NoneType' object has no attribute 'group'
为什么不起作用?任何帮助表示赞赏。谢谢
当您获得此代码时,应该可以使用
编辑1改进代码,只拆分第一个巧合
split3=re.split(': |-',key_value3, 1)
#keys.append(split3[0])
#data.append(split3[1])
k,v = split3
your_dict[k] = v
注意这一行job_location = job_location.search(text)
,搜索不成功,因为job_location = None
,因此出现错误,你不会从None
得到任何东西,你要么需要更改 text
或使用 job_location
您的正则表达式有几个问题。让我们使用正则表达式来搜索工作地点。你有:
r'(^Job?.*\S+?)'
- 首先,如果不使用
flags=re.MULTILINE
,^
字符将只匹配字符串的开头,而不是一行的开头。 Job?
匹配Jo
(可选) 后跟b
.- 在没有
flags=re.DOTALL
的情况下,.*
会贪心匹配任何非换行符0或更多次。 \S+?
将有选择地匹配 1 个或多个非白色 space 字符。
例如,您的正则表达式将匹配以下行:Joabcdefg
与 .*
匹配 abcdef
和 \S+?
匹配 g
.
您还调用了 match
对象的 group
方法。但是您必须向此方法传递一个整数,指定您感兴趣的组号。
搜索工作地点所需的正则表达式在以下示例中给出:
import re
text = """=Requisition No: VOI9053459-
Job location: Melbourn
Exp : 2 – 4 Years
Notice period :-15day or less"""
job_location_re = re.compile(r'(?:^Job\s+location:\s+)(.*)$', re.MULTILINE)
m = job_location_re.search(text)
if m: # there is a match
job_location = m.group(1)
print(job_location)
打印:
Melbourn
请注意,我调用了已编译的正则表达式 job_location_re
,而不是对正则表达式和位置名称都使用名称 job_location
。
(?^Job\s+location:\s+)
匹配行首的Job location:
,允许Job
和location:
之间以及 [=33= 之后的一个或多个 space ].这是在 非捕获 组中完成的。(.*)
匹配 greedily 直到行尾的任何非换行符。这将是第 1 组。$
匹配行尾。