2015-10-04 26 views
1

我目前正试图提取我当地议会进行的一系列讨论。从公开网站上存储的会议纪要中刮掉对话

我已经提取了超过4000个独特的URL到每个记录的讨论。现在最后一个缺失的步骤是为每个对话刮取元数据,并根据发言者的正确顺序分割文本。

我的理想的数据是: 第1行日期,标题,扬声器A的名字,他说 第2行日期,标题,讲话者B的名字,她说什么 ...

Example URL 1 Example URL 2

什么

我试过的东西: Webscraper.io一直是最有希望的。然而,它随机排列,因此我的演讲全部混乱起来。

iRobot公司和Import.io似乎不能够拾取的Javascript

Cloudscrape勉强得到了它,因为凌乱的标签。对话以问题标签开始,前两个对话的答案标签。进一步的辩论都是使用主题标签附加的。 (谁设计的系统did'nt想不止一个1 questiona和1个答复)

背景: 我想解析这回SQL,这样我可以想像,做的数据指标。我曾尝试询问业主,但他们没有准备好原始数据。我已经详细了解了数据的结构,并且最好只是刮掉它,而不是访问混乱的源代码。

我已经试过寻找Beautifulsoup,但我仍然完全迷失在我应该如何开始/它是否是正确的工具在第一个地方。

+0

网站上的JavaScript将采取载入时间太长,而且会超时大多数数据提取平台的要求。 您将不得不使用JS渲染工具渲染页面,等待几秒钟,然后才能提取所需的数据。 如果您试图按比例进行此操作,并且定期处理和渲染成本方面的成本可能会很快增加。祝你好运:) – CavemanDan

回答

0

我之前写过一个爬行器,这有点矫枉过正,因为它调用两次美丽的汤,但这是我能找到从页面中拉出所有可见文本的唯一方法。

from bs4 import BeautifulSoup, Comment 
import urllib 
import sys 
reload(sys) 
sys.setdefaultencoding("utf-8") 
import re 

def get_all_words(page): # gets all visible text on webpage 
    soup = BeautifulSoup(page, "html.parser") 
    for element in soup(text=lambda text: isinstance(text, Comment)): 
     element.extract() 
    soup = BeautifulSoup(str(soup), "html.parser") 
    soup = soup.findAll(text=True) 
    visible_texts = filter(visible, soup) 
    words = [] 
    for x in visible_texts: 
     for wrd in x.split(): 
      valid = re.match('^[\w-]+$', wrd) is not None 
      if len(wrd) > 1 and valid: 
       words.append(str(wrd.encode("UTF-8"))) 
    return words 

def visible(element): 
    if element.parent.name in ['style', 'script', '[document]', 'head', 'title','link',',','.',' | ']: 
     return False 
    return True 

page = urllib.urlopen('http://www...').read() 
print get_all_words(page) 

可能是一些对你有用