sam*_*sam 5 python pdf pdf-scraping
我正在制作一个pdf文件.该pdf中有多个表格.
根据pdf中给出的表名,我想使用python从该表中获取数据.
我从事过html,xlm解析,但从未使用过pdf.
谁能告诉我如何使用python从pdf中获取表格?
这是一个非常复杂的问题,一般无法解决。
原因很简单,PDF 格式太灵活了。有些 PDF 只是位图(那时你必须自己做 OCR——显然不是我们这里的主题),有些是一堆字面上溢出的字母;这意味着通过解析 PDF 中的文本信息,您可以在某些坐标上放置单个字符。在某些情况下,它们以有序的方式出现(逐行,从左到右),但在某些情况下,您会得到类似随机的分布,最常见的是 和 东西,但也有特殊字符,不同字体的字符等. 可能会出格。
唯一正确的方法是将所有字符根据它们的坐标放置在页面模型上,然后使用启发式方法找出线条是什么。
我建议在开始之前查看您的 PDF 以及您想要解析的表格。也许它们一直都是相似的,并且可以很好地解析。
祝你好运!
我最近遇到了类似的问题,并写了一个库来帮助解决它:pdfquery.
PDFQuery从PDF创建一个元素树(使用pdfminer,带有一些额外的糖),并允许您使用JQuery或XPath选择器从页面获取元素,主要基于元素的文本内容或位置.因此,要解析表,您首先要通过搜索标签找到它在文档中的位置:
label = pdf.pq(':contains("Name of your table")')
left_corner = float(label.attr('x0'))
bottom_corner = float(label.attr('y0'))
Run Code Online (Sandbox Code Playgroud)
然后你会继续搜索表格下面的行,直到搜索没有返回结果:
page = label.closest('LTPage')
while 1:
row = pdf.extract( [
('column_1', ':in_bbox("%s,%s,%s,%s")' % (left_corner+10, bottom_corner+40, left_corner+50, bottom_corner+20)),
('column_2', ':in_bbox("%s,%s,%s,%s")' % (left_corner+50, bottom_corner+40, left_corner+80, bottom_corner+20))
], page)
if not row['column_1'] or row['column_2']:
break
print "Got row:", matches
bottom_corner -= 20
Run Code Online (Sandbox Code Playgroud)
这假设你的行高20点,第一列从标签下方20点开始,第一列从标签的左边缘跨越10到50点,第二列从左边跨越50到80点标签的边缘.
如果你有空行或不同高度的线条,这将变得更加烦人.如果表中的条目足够接近以使解析器认为它只是一行,您可能还需要使用merge_tags = None选项来选择单个字符而不是单词.但希望这会让你更接近......
| 归档时间: |
|
| 查看次数: |
10634 次 |
| 最近记录: |