2013-08-08 3 views
0

Вот мой код для скребка, который извлекая URL и соответствующие комментарии с этой конкретной страницы:Scraperwiki: как сохранить данные в одну ячейку в таблице

import scraperwiki 
import lxml.html 
from BeautifulSoup import BeautifulSoup 
import urllib2 
import re 

for num in range(1,2): 
    html_page = urllib2.urlopen("https://success.salesforce.com/ideaSearch?keywords=error&pageNo="+str(num)) 
    soup = BeautifulSoup(html_page) 
    for i in range(0,10): 
     for link in soup.findAll('a',{'id':'search:ForumLayout:searchForm:itemObj2:'+str(i)+':idea:recentIdeasComponent:profileIdeaTitle'}): 
      pageurl = link.get('href') 
      html = scraperwiki.scrape(pageurl) 
      root = lxml.html.fromstring(html) 

      for j in range(0,300): 
       for table in root.cssselect("span[id='ideaView:ForumLayout:ideaViewForm:cmtComp:ideaComments:cmtLoop:"+str(j)+":commentBodyOutput'] table"): 
        divx = table.cssselect("div[class='htmlDetailElementDiv']") 
        if len(divx)==1: 
         data = { 
          'URL' : pageurl, 
          'Comment' : divx[0].text_content() 
         } 
         print data 


     scraperwiki.sqlite.save(unique_keys=['URL'], data=data) 
     scraperwiki.sqlite.save(unique_keys=['Comment'], data=data) 

Когда данные сохраняются в scraperwiki датасторе в таблицу помещается только последний комментарий из одного URL-адреса. Я бы хотел, чтобы в каждом URL-адресе хранились все комментарии. Таким образом, в одном столбце есть URL-адрес, а во втором столбце есть все комментарии от этого URL-адреса, а не только последний комментарий, который заканчивается этим кодом.

ответ

0

Как я могу видеть из вашего кода, вы помещаете data в самый внутренний цикл for и присваиваете ему новое значение каждый раз. Поэтому, когда цикл for заканчивается и переходит на этап сохранения, data будет содержать последний комментарий. Я думаю, вы можете использовать:

for i in range(0,10): 
     for link in soup.findAll('a',{'id':'search:ForumLayout:searchForm:itemObj2:'+str(i)+':idea:recentIdeasComponent:profileIdeaTitle'}): 
      pageurl = link.get('href') 
      html = scraperwiki.scrape(pageurl) 
      root = lxml.html.fromstring(html) 
      data = {'URL': pageurl, 'Comment':[]} 

      for j in range(0,300): 
       for table in root.cssselect("span[id='ideaView:ForumLayout:ideaViewForm:cmtComp:ideaComments:cmtLoop:"+str(j)+":commentBodyOutput'] table"): 
        divx = table.cssselect("div[class='htmlDetailElementDiv']") 
        if len(divx)==1: 
         data['Comment'].append(divx[0].text_content) 

     scraperwiki.sqlite.save(unique_keys=['URL'], data=data) 
     scraperwiki.sqlite.save(unique_keys=['Comment'], data=data) 
+0

по какой-то причине, когда я запускаю этот код в scraperwiki, я получаю эту ошибку: Файл «./code/scraper», строка 25 scraperwiki.sqlite.save (unique_keys = [» URL '], data = data) ^ IndentationError: unindent не соответствует внешнему уровню отступа – user2662750

Смежные вопросы