PDFQueryを使用してPDFをスクレイピングするのはこれが初めてです。
私がする必要があるのは、いくつかのページを持つ価格表から価格を取得することです。製品コードを PDFQuery に渡したいのですが、コードを見つけてその横に価格を返す必要があります。問題は、Github ページで最初の例を使用するとテキストの場所が取得されることですが、「名前がページのどこにあるのか、またはどのページにあるのかを知る必要がないことに注意してください」と明確に示されています。これは私の価格表の場合ですが、他のすべての例ではページ番号 ( LTPage[pageid=1]
) が指定されていますが、ページ番号を取得する場所がわかりません。
ページ番号を指定しないと、すべてのページの同じ場所にあるすべてのテキストが返されます。
また、exactText
コードは「92005」「92005C」「92005G」など、:contains
単体ではあまり役に立たないので、機能を追加しました。
要素が配置されているページを選択し、 JQuery を使用してみましたが.closest
、どちらもうまくいきませんでした。
PDFMiner のドキュメント とPyQuery のドキュメントを確認しましたが、役に立た ないものはありません =(
私のコードは今次のようになります:
import pdfquery
pdf = pdfquery.PDFQuery("tests/samples/priceList.pdf")
pdf.load()
code = "92005G"
def exactText():
element = str(vars(this))
text = str("u'" + code + "\\n'")
if text in element:
return True
return False
#This should work if i could select the page where the element is located
#page = pdf.pq('LTPage:contains("'+code+'")')
#pageNum = page.attr('pageid')
#Here I would replace the "8" with the page number i get, or remove the LTPage
#selector all together if i need to find the element first and then the page
label = pdf.pq('LTPage[page_index="8"] LTTextLineHorizontal:contains("'+code+'")').filter(exactText)
#Since we could use "JQuery selectors" i tried using ".closest", but it returns nothing
#page = label.closest('LTPage')
#pageNum = page.attr('pageid')
left_corner = float(label.attr('x0'))
bottom_corner = float(label.attr('y0'))
#Here I would replace the "8" with the page number i get
price = pdf.pq('LTPage[page_index="8"] LTTextLineHorizontal:in_bbox("%s, %s, %s, %s")' % (left_corner+110, bottom_corner, left_corner+140, bottom_corner+20)).text()
print price
皆さん、どんな助けも大歓迎です!!!