2015-10-06 111 views
0

爲了我自己的未來便利,我決定嘗試創建一個Java程序,可以在我的計算機上使用目錄,並在電視節目中使用維基百科條目的URL,然後重命名所有顯示名稱爲「S x E y」的該目錄中的文件和該集的標題。雖然我相信我有工作代碼來重命名文件,但我堅持的一件事是填充包含劇集名稱的數組。雖然這可以手動完成,但首先會消除程序的重點,所以我希望能夠從互聯網上獲取信息。從Java中提取維基百科表中的特定元素

現在有問題的電視節目是Arrow,我正在尋找現在第2季的劇集名稱。我一直在嘗試修改this jsoup教程來訪問這些表格,希望在它至少開始工作後能夠縮小到所需的表格。我參考修改後的代碼:

package tablescraper; 

import java.io.IOException; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

public class TableScraper { 

public static void main(String[] args) { 
    try { 
     Document doc = Jsoup.connect("http://en.wikipedia.org/wiki/List_of_Arrow_episodes").get(); 
     Elements trs = doc.select("table.wikitable tr"); 

     //remove header row 
     trs.remove(0); 

     for (Element tr : trs) { 

      Elements tds = tr.getElementsByTag("td.summary"); 
      Element td = tds.first(); 
      System.out.println("Episode: " + td.toString()); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

在它是我在System.out.println("Episode: " + td.toString());面臨java.lang.NullPointerException當前狀態。我試圖在getElementsByTag聲明中添加.summary,希望只能挑選出具有「摘要」類的元素,這是我需要的。

到目前爲止,我在方法中犯了錯誤嗎?我所做的任何明顯的遺漏?你會注意到表格中的每一行都包含了一段總結了這一集的段落 - 這種格式變化是問題的一部分嗎?如果我像現在一樣迭代每個表格行,它會不會成爲問題?展望未來,我將如何區分網頁上的每個表格?如果沒有辦法區分他們之間的這個特定的來源,那麼這不是世界末日,因爲如果有必要,我可以簡單地採取所有事件的列表,然後將其減少到選定範圍的條目在需要的情節數字上。

+0

你怎麼知道它剛從第二季回來?這個'doc.select(「table.wikitable td.summary」)'應該返回來自所有季節的所有劇集的名字。 – FirstOne

+0

我不知道它是什麼,但那是我的最終目標。現在我想它會查看頁面上包含指定標籤的所有表格,但目前還沒有運氣。隨着你的改變,我將如何輸出該劇集列表?我會調整'tr.getElementsByTag'到'tr.getAllElements'嗎?我對這個圖書館並不熟悉,但是列出所有情節會讓我更接近我的目標。 –

回答

1

頁面中必須有類別爲wikitable的表格,其中包含td元素,但不包含類別summary

因此,這是你在輸出前插入一個空檢查一個好主意td

Elements tds = tr.getElementsByTag("td.summary"); 
Element td = tds.first(); 
if (td != null) 
    System.out.println("Episode: " + td.toString()); 

然後

Elements tds = tr.getElementsByTag("td.summary"); 

因爲沒有與元素絕不會返回一個非空列表標籤td.summary。再次使用select尋找選擇td.summary匹配其後代:

Elements tds = tr.select("td.summary"); 

最後打印出來的插曲(這是td元素的文本內容)不使用td.toString()td.text()

System.out.println("Episode: " + td.text()); 
+0

好的,我做了這個改變,現在錯誤消失了,但是代碼沒有返回結果。是否有可能僅查看行中的第一個項目,然後在看到它不是類「摘要」時移動到下一行? –

+0

@SimonB'tr.getElementsByTag(「td.summary」)'有問題。看到我編輯的帖子, – wero

+0

啊我現在看到了。有了這個改變,程序現在輸出整個html的輸入,例如輸出的第二行是Episode:「榮譽您的父親」'。不包括「Episode:」位,我想我現在可以使用子字符串在'>「'和<」之後刪除所有內容,對吧?第一行不遵循這種格式,但我可以稍後再糾正。 –