【发布时间】:2014-06-02 03:51:46
【问题描述】:
我正在用 Python 解析一些 PDF。这些 PDF 在视觉上被组织成行和列。 pdftohtml 脚本将这些 PDF 转换为 XML 格式,其中充满了松散的 <text> 标签,这些标签没有任何层次结构。然后,我的代码需要将这些 <text> 标记重新排序为行。
由于每个<text> 标记都具有“顶部”或“左侧”坐标等属性,因此我编写了代码以将具有相同“顶部”坐标的<text> 项目附加到列表中。这个列表实际上是一行。
我的代码首先遍历页面,找到所有唯一的“顶部”值,并将它们附加到顶部列表中。然后它遍历这个顶级列表。对于每个唯一的最高值,它会搜索具有该“最高”值的所有项目并将它们添加到行列表中。
for side in page:
tops = list( set( [ d['top'] for d in side ] ) )
tops.sort()
for top in tops:
row = []
for blob in side:
if int(blob['top']) == int(top):
row.append(blob)
rows.append(row)
此代码适用于我正在解析的大多数 PDF。但在某些情况下,同一行上的项目的最高值略有不同,相差一到两个。
我正在尝试调整我的代码,使其变得更加模糊。
底部的比较似乎很容易修复。像这样的:
for blob in side:
rangeLower = int(top) - 2
rangeUpper = int(top) + 2
thisTop = int(blob['top'])
if rangeLower <= thisTop <= rangeUpper :
row.append(blob)
但我首先创建的唯一顶级值列表是一个问题。我使用的代码是
tops = list( set( [ d['top'] for d in side ] ) )
在这些边缘情况下,我最终会得到如下列表:
[925, 946, 966, 995, 996, 1015, 1035]
如何调整该代码以避免列表中出现“995”和“996”?我想确保当整数彼此相差 1 或 2 时,我只得到一个值。
【问题讨论】:
-
如果您的列表中有
1,2,3,4,5,您会选择哪一个? 1和4? 1 和 5 ? 2和5? 3? -
在我正在解析的 PDF 中,行始终间隔至少 20 个单位,所以我认为我不会得到这样的列表。