2016-06-07 51 views
2

,所以我試圖解析在IMDB頁面http://www.imdb.com/genre/?ref_=nv_ch_gr_3BeautifulSoup指標

的流派和其他風格的鏈接,現在已經能夠主流派標籤解析成可用 東西用下面的代碼

table = soup.find_all("table", {"class": "genre-table"}) 

for item in table: 
    for x in range(100): 

     try: 
      print(item.contents[x].find_all("h3")) 
      print(len(item.contents[x].find_all("h3"))) 
     except: 
      pass 

和我的輸出是11個兩個標籤組名單中像這樣

[<h3><a href="http://www.imdb.com/genre/action/?ref_=gnr_mn_ac_mp">Action <span class="normal">»</span></a></h3>, <h3><a href="http://www.imdb.com/genre/adventure/?ref_=gnr_mn_ad_mp">Adventure <span class="normal">»</span></a></h3>] 
2 

我理解這一點,因爲ŧ他的容器有一類「偶數」和「奇數」,每個容器中有兩個h3標籤,但我沒有詳細說明它是爲了區分偶數還是奇數,實際上我認爲我在這裏回答我自己的問題,我正確地認爲因爲它是在一個容器類中是奇數還是偶數,bs4把它放在一個列表中以顯示它,並由我來分開它們?

第二個更重要的問題:

我怎麼會得到每個H3鏈接和標題到我的數據幀,我已經設置爲

df = pd.DataFrame(columns= ['Genre', 'Sub-Genre', 'Link']) 

我已經試過

有效範圍內的ÿ (2):

df.append({'Genre':'item.contents[x].find_all("h3"))[y].text)},  ignore_index = true) 

這是嵌套在for循環與x當然(不是自己的)
但它似乎不工作 任何想法?業力你的方式!

回答

2

首先有沒有需要找到所有的表,因爲只有第一個是neccessary:

table = soup.find("table", {'class': 'genre-table'}) 

而且由於所有其他產品冗餘(從第一個開始),您可以遍歷表是這樣的:

for item in list(table)[1::2]: 

在此之後,我們可以通過他們兩個拿到「H3」每一行和迴路標籤:

row = item.find_all("h3") 

    for col in row: 

因爲每一次「H3」元素的文本返回此格式體裁:「Somegenre \ XC2 \ XBB」我刪除了span元素獲取文本之前:

 col.span.extract() 
     link = col.a['href'] 
     genre = col.text.strip() 

在此之後只需要添加的元素通過索引數據框:

 df.loc[len(df)]=[genre, None, link] 

全碼:

import pandas as pd 
import requests 
from bs4 import BeautifulSoup 

df = pd.DataFrame(columns=['Genre', 'Sub-Genre', 'Link']) 

req = requests.get('http://www.imdb.com/genre/?ref_=nv_ch_gr_3') 
soup = BeautifulSoup(req.content, 'html.parser') 

table = soup.find("table", {'class': 'genre-table'}) 

for item in list(table)[1::2]: 
    row = item.find_all("h3") 

    for col in row: 
     col.span.extract() 
     link = col.a['href'] 
     genre = col.text.strip() 

     df.loc[len(df)] = [genre, None, link] 
+0

人,是完美整理我的權利了,要走了,雖然對其中的一些功能,哈哈,一個問題晚自習,當你切片e列表你如何迭代它?我稍微拋出兩個冒號 – entercaspa

+0

編輯我只是不明白你如何在4個位置切片,如列表中的4個元素[表格] [elements-go-here] – entercaspa

+0

@entercaspa我不知道你的意思,但列表(表)返回表格元素的列表,以便我可以對它們進行切片。語法如下所示:[start:end]或[start:end:step]。開始默認爲0,並結束默認爲len(列表),所以你可以把它們放在這裏:[start:],[:end]或[:]。最後一個選項步驟允許您跨越元素,在這裏[1:(end):2]我們跳過每個第二個元素。語法[:: 3]會跳過每三分之一等等。 –