2016-10-03 22 views
0

我有一個PDF格式的郵件參考列表。郵件列表有一個非常通用的格式,例如作者名稱,後面跟着該書的名稱。 請看下面的例子:使用Python解析PDF和提取作者和書名

美國閱讀列表

民主理論

•達爾,序民主理論

•熊彼特,資本主義,社會主義與民主(導第四部分)

•自由人的人格,生活和時代民主

•達爾,民主及其批判

現在我嘗試使用PDF礦工解析PDF格式,並創建一個列表,其中在第一索引是作者名,第二個指標是這本書的名字就像這樣:

[達爾,序民主理論]

我試圖使用分割功能,因爲有一個逗號和後面的作者姓名的空間。但是我沒有得到正確的結果。 有人可以幫忙嗎?

def extract(): 
    string = convert_pdf_to_txt("/Users/../../names.pdf") 
    lines = list(filter(bool, string.split('\n'))) 
    for i in lines: 
     check.extend(i.split(',')) 
    x=remove_numbers(check) 
    remove_blank= [x for x in x if x] 
    combine_two = [remove_blank[x:x + 2] for x in xrange(0,len(remove_blank), 2)] 
    print combine_two 

回答

2

讓我們來看看這裏出了什麼問題。我正在猜測,但希望他們是相關的。

  1. 您的convert_pdf_to_text()函數返回包含PDF所有文本的單個長字符串。
  2. 您將文本分割爲", ",這會生成一個字符串列表。

鑑於你的數據。例如,這個名單看起來是這樣的(每個元素都是在單獨一行這裏):

Dahl 
Preface to Democratic Theory(line break)(bullet)(tab)Schumpeter 
Captitalism 
Socialism 
and Democracy (Introduction and part IV only)(line break)(bullet)(tab)Machpherson 
Life and Times of Liberal Democracy(line break)(bullet)(tab)Dahl 
Democracy and its Critics 

因爲你", "分裂沒有的事實方面的數據進行格式化作爲線條,你最終會得到每個項目中多行的東西。

  1. 現在您使用filter()來遍歷此列表並過濾出所有不是真的。一個非空字符串是真的,並且所有元素都是非空字符串,所以所有元素都會通過。因此您的filter()不會執行任何操作。

你似乎什麼要的是更多的東西是這樣的:

lines = [line.split(", ", 1) for line in string.splitlines() if ", " in line] 

在這裏,我們首先拆分線,過濾掉任何沒有逗號空間在其中,並返回一個列表列表基於在第一個逗號空間分割字符串。

+0

嗨kindall,謝謝你的幫助。但是我仍然沒有得到正確的結果。[達爾','民主主義理論小冊子,資本主義,社會主義和民主(僅介紹和第四部分)自由民主達人,民主及其批評家的人生,時代]] –

+1

我的猜測是你的'convert_pdf_to_txt()'不包括換行符。經過反思,這可能是因爲PDF實際上沒有包含換行符(他們只是說「在這裏打印下一個」和「這裏」恰好在下一行的開頭)。有沒有其他的方法可以檢測到一個項目結束和下一個開始?它包括子彈嗎?如果是這樣,你可以嘗試拆分這些。 – kindall

+0

我不知何故使用新的行分割功能來實現結果。然而,試圖將作者姓名和書名結合起來,通過將更大的列表中的每個第一和第二元素單獨列出,我遇到了一個問題。標題隨着作者姓名..這是一個結果的片段: [[''美國閱讀列表','修訂//'],['民主理論','麥迪遜'],['聯邦黨','' '],['達爾','民主理論序言'] –