0

商品の複数の異なる出荷に関する情報を示す PDF ファイルを解析しています。データには、住所、商品の金額などが含まれます。各ファイルの実体を構成するテキストの文字列を取得することに成功しました。ファイルの表示は比較的一貫していますが、HTML や XML などのデータを簡単に見つけることはできません。まず、アイテムの数を取得しようとしています。テキストには、部分文字列「<code>TOTAL BOXES:」のインスタンスが複数あります。それぞれの後に整数があります (したがって、次のようになります: “<code>TOTAL BOXES: 3”)

以下のコード (一番下まで) に見られるように、私の方法は次のとおりです。

  1. キー フレーズ「<code>TOTAL BOXES:」のインスタンスを見つけます。
  2. 「<code>TOTAL BOXES:」</li> の各インスタンスのインデックスを検索
  3. この部分文字列の最後の文字のインデックス (この場合は「<code>:」) を使用して、2 文字のインデックス位置を「<code>move forward」してデータを取得します。

おそらくもっと洗練された解決策があると思います。しかし、現在、私が選択したアプローチの主な障害は次のとおりです。

キー フレーズの各インデックスをリスト内の項目として返すことができます。次に、そのインデックスに 2 を加算して、「バックエンド」インデックスを取得します。対象となるデータを提供するテキスト内の正確なインデックスまたは各場所がわかりました。各インデックスは、変数の下にリスト アイテムとして格納されますinstance_begin

これは私のコードがばらばらになり、私の初心者が明るく輝く場所です. データを取得するために、私はこれを行います:

instance_begin のボックスの場合:

box = raw_data[(instance_begin[box]):(instance_end[box])]

例外を返します:

TypeError: リストのインデックスはリストではなく整数でなければなりません

助けていただければ幸いです。

コード:

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO
from re import findall, finditer

path = "/file.pdf"

def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = file(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()

    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)

    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()
    return text

raw_data = convert_pdf_to_txt(path)

key_phrase = "TOTAL BOXES:"

instance_begin = [i.end() for i in re.finditer(key_phrase, raw_data)]

instance_end = [(i + 2) for i in instance_begin]

box = raw_data[(instance_begin[box]):(instance_end[box])]
4

1 に答える 1

0

あなたの問題についての私の理解を要約させてください。という名前の長い文字列がありますraw_data。この文字列から特定の 2 文字のシーケンスをスライスしたいとします。これらのスライスが始まるインデックスは list に格納されますinstance_begin。それが正しければ、ここに1行の解決策があります:

box = [raw_data[i:i+2] for i in instance_begin]

このステートメントの最後にbox、目的の 2 文字の文字列のリストがあります。リストinstance_endは不要です。私がまだあなたの問題を誤解している場合はお詫び申し上げます。

于 2015-08-10T20:41:02.593 に答える