2015-07-09 99 views
0

我試圖抓取的網站是http://www.boxofficemojo.com/yearly/chart/?yr=2015&p=.htm。 這個網站有一個電影列表,並且對於每部電影,我想在表格中獲得以下信息,不包括日期。Python BeautifulSoup webcrawling:獲取沒有鏈接或類標籤的文本

enter image description here

enter image description here

我有這個麻煩,因爲文本沒有鏈接或任何類別的標籤。我嘗試過使用多種方法,但都沒有工作。

這是我迄今爲止的一種方法,只是爲了獲得每部電影的排名。 我所要的輸出只是每部電影的等級,然後有每個電影,週末總值的名單另一份名單的組成名單的列表等

listOfRanks = [[1, 1, 1,], [1, 2, 3], [3, 5,1]], etc. 
listOfWeekendGross = [[208,806,270,106588440,54200000], [111111111, 222222222, 333333333]] 


def getRank(item_url): 
    href = item_url[:37]+"page=weekend&" + item_url[37:] 
    response = requests.get(href) 
    soup = BeautifulSoup(response.content, "lxml") # or BeautifulSoup(response.content, "html5lib") 
    rank = soup.select('tbody > tr > td > center > table > tbody > tr > td > font') 
    print rank 

這是我調用該函數 -

def spider(max_pages): 
    url = 'http://www.boxofficemojo.com/yearly/chart/?page=' + str(max_pages) + '&view=releasedate&view2=domestic&yr=2015&p=.htm' 
    source_code = requests.get(url) 
    plain_text = source_code.text 
    soup = BeautifulSoup(plain_text) 
    for link in soup.select('td > b > font > a[href^=/movies/?]'): 
     href = 'http://www.boxofficemojo.com' + link.get('href') 
     getRank(href) 

問題是getRank(href)方法沒有正確地向列表添加行列。問題是這條線我認爲 -

rank = soup.select('tbody > tr > td > center > table > tbody > tr > td > font') 

這可能不是正確的方式來獲取此文本。

如何從本網站獲得所有等級,週末總數等?

+++++++++++++++++++++++++++++++++ enter image description here

enter image description here

回答

1

是的,問題在於你正在使用的選擇器。你看,那個網站的標記是,很好,很不好。這些表格沒有正確編碼,實際上它們缺少tbody標籤,但Google Chrome瀏覽器仍然會添加它們,這就是爲什麼您在Web Developer Tools中看到它們的原因。

但是,正如我所說的,它們不在實際的HTML代碼中,所以如果您在選擇器中使用tbody,那麼BeautifulSoup無法匹配行。看起來該表具有類chart-wide,因此你可以使用目標行:

rows = soup.select('.chart-wide tr') 

之後,你可以遍歷這些rows,跳過第一個(因爲那會是報頭)和解析其他人和他們的個人細胞。

像這樣:

def getRank(item_url): 
    href = item_url[:37]+"page=weekend&" + item_url[37:] 
    response = requests.get(href) 
    print response.status_code, "for", href 
    soup = BeautifulSoup(response.content) # or BeautifulSoup(response.content, "html5lib") 

    rows = soup.select('.chart-wide tr') 

    header_skipped = False 
    for row in rows: 
     if not header_skipped: 
      header_skipped = True 
      continue 

     headers = "Date Rank WeekendGross Change Theaters Change/Avg GrossToDate Week".split() 

     for header, child in zip(headers, row.children): 
      print header, ":", child.text 
+0

出於某種原因「child.text」行不起作用。我也試過child.string和child.getText()。具體的錯誤是UnicodeEncodeError:'charmap'編解碼器不能在位置6編碼字符u'\ x96':字符映射到。如果我只是打印標題部分,它的工作原理 – alphamonkey

+0

你確定嗎?這是我正在使用的整個腳本,它在我的機器上工作:https://ideone.com/Jt3OCh –

+0

我認爲可能有錯誤的編碼文件,基於錯誤文件「C:/ Users/younjin /PycharmProjects/untitled/movies.py「,第96行,在getRank中 打印標題,」:「,child.text 文件」C:\ Python27 \ lib \ encodings \ cp1252.py「,第12行,編碼爲 return codecs.charmap_encode(input,errors,encoding_table) UnicodeEncodeError:'charmap'編解碼器無法編碼字符u'\ x96'在位置6:字符映射到 alphamonkey

0

看似,這個圖表表是動態的生成,使用Phantomjs,一切正常

from selenium import webdriver 
from bs4 import BeautifulSoup 
driver = webdriver.PhantomJS() 
driver.get('http://www.boxofficemojo.com/movies/?page=weekend&id=jurassicpark4.htm') 
soup = BeautifulSoup(driver.page_source) 
soup.select('table.chart-wide tbody tr td font') 

出[1]

[<font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=date&amp;order=DESC&amp;p=.htm"><b>Date<br>(click to view chart)</br></b></a></font>, 
<font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=rank&amp;order=ASC&amp;p=.htm">Rank</a></font>, 
<font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=wkndgross&amp;order=DESC&amp;p=.htm">Weekend<br>Gross</br></a></font>, 
<font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=perchange&amp;order=DESC&amp;p=.htm">%<br>Change</br></a></font>, 
<font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=theaters&amp;order=DESC&amp;p=.htm">Theaters</a></font>, 
<font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=theaterchange&amp;order=ASC&amp;p=.htm">Change</a>/</font>, 
<font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=avg&amp;order=DESC&amp;p=.htm">Avg.</a></font>, 
<font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=todategross&amp;order=DESC&amp;p=.htm">Gross-to-Date</a></font>, 
<font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=weeknum&amp;order=ASC&amp;p=.htm">Week<br>#</br></a></font>, 
<font size="2"><a href="/weekend/chart/?yr=2015&amp;wknd=24&amp;p=.htm"><b>Jun 12–14</b></a></font>, 
<font size="2">1</font>, 
<font size="2">$208,806,270</font>, 
<font size="2">-</font>, 
<font size="2">4,274</font>, 
. 
. 
. 
<font size="2">$500,373,420</font>, 
<font size="2">3</font>, 
<font size="2"><a href="/weekend/chart/?yr=2015&amp;wknd=27&amp;p=.htm"><b>Jul 3–5</b></a></font>, 
<font size="2">2</font>, 
<font size="2">$29,242,025</font>, 
<font size="2"><font color="#ff0000">-46.4%</font></font>, 
<font color="#ff0000">-46.4%</font>, 
<font size="2">3,737</font>, 
<font size="2"><font color="#ff0000">-461</font></font>, 
<font color="#ff0000">-461</font>, 
<font size="2">$7,825</font>, 
<font size="2">$556,542,980</font>, 
<font size="2">4</font>] 
相關問題