从公共网站上存储的会议纪要中刮取对话

时间:2015-10-04 10:08:26

标签: javascript jsp web-scraping

我目前正试图提取我当地议会进行的一系列讨论。

我已经为每个记录在案的讨论提取了超过4000多个唯一的网址。现在最后一个缺失的步骤是刮取每个对话的元数据,并根据说话的人和正确的顺序拆分文本。

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

Example URL 1 Example URL 2

我尝试了什么: Webscraper.io一直是最有前途的。然而,它以随机顺序刮擦,因此我的演讲都混乱了。

iRobot和Import.io似乎无法获取Javascript

由于凌乱的标签,Cloudscrape几乎没有得到它。对话以问号标签开头,前两个对话的答案标签。使用主题标签附加了进一步的辩论。 (无论是谁设计了系统,都不会想到一个以上的问题和一个回复)

背景 我正在考虑将其解析为SQL,以便我可以可视化并为数据做指标。我之前尝试过问过业主,但他们没有准备好原始数据。我已经看了一下数据的结构,最好只是抓住它而不是访问凌乱的数据源。

我曾尝试过观察Beautifulsoup,但我仍然完全迷失于我应该如何开始/它是否是最适合的工具。

1 个答案:

答案 0 :(得分: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) 

可能会对您有所帮助