2014-09-25 128 views
0

我有一组7个文件包含非结构化数据,我试图解析成7个使用beautifulsoup获得的Python数据集。数据呈现的方式有很多,我正在努力通过正则表达式或其他解析包来找到合适的方法。从BeautifulSoup解析非结构化数据到结构化数据集

我粘贴的数据的一个片段到引擎收录:http://pastebin.com/sC9KbhbF

输出的数据是这样的(我只是用管分离领域的说明,我想这些作为输出单独的列):

Street | City | Postal Code 
jln.sidomulyo i-vi | cepu | 58312 
jln.sitimulyo | cepu | 58312 
lr.sitimulyo i-vi | cepu | 58312 
lr.sitimulyo ia-iiia | cepu | 58312 
lr.sitimulyo ib-iiib | cepu | 58312 
lr.sitimulyo ic | cepu | 58312 
lr.sitimulyo iic | cepu | 58312 
jln.sorogo | cepu | 58313 
..... 
jln.akhmad dakhlan kel.ciamis | ciamis | 46211 
jln.akhmad dakhlan kel.linggasari | ciamis | 46216 
..... 

,使该模式这一硬:
1)把用逗号地址(例如LR sitimulyo I-VI,IA-IIIA在单独的行保持完整的街道名称
2)消除空白之后)。期间f或两个字母前缀(例如, LR。 sitimulyo与jln.sidomulyo)
3)嵌套地址落下街道名称(如jln.akhmad dakhlan kel.ciamis,jln.akhmad dakhlan kel.linggasari)

我已经尝试了一些不同的方法,但有甚至没有远距离接近,所以我没有包含这些片段。我用来获取数据的代码如下:

from bs4 import BeautifulSoup 
import urllib2 
import re 
import bleach 
import pandas 

url_base = "http://www.indonesianewsonline.com/prangko/stamps" 

url_seed = url_base + "/kodepos.htm" 

content = urllib2.urlopen(url_seed).read() 

soup = BeautifulSoup(content) 

#print soup.prettify() 

additional_links = [] 

for link in soup.findAll('a', href=True, text=re.compile('Cities*')): 
    additional_links.append(link['href']) 

links_to_scrape = [url_base + "/" + s for s in additional_links] 

data_files = [] 

for s in links_to_scrape: 
    a = BeautifulSoup(urllib2.urlopen(s).read()) 
    data_files.append(a.findAll('pre')) 

回答

0

下面是它应该是如何工作的:首先,你使用这些正则表达式和replecments使输入文字更易于管理:

",[ ]*\n[ ]*" replace this with a single comma "," 
"\.{2,}" replace this with a single whilte space " " 
", " (comma and space) replace it with a single comma "," 
"\. " (point a space) replace it with a single point "." 
"^[ ]*" any space at the start replace with nothign "" 

然后你可以使用这个表达式

"(?<arg1>[^ ]*) (?<arg2>[^ ]*) (?<arg3>[^ ]*) (?<arg4>[0-9]*)[ ]*[\n\r]" 

如果我们把现在变换后的第一线

jln.sidomulyo i-vi cepu 58312 

你(注ARG1 actualy有一个新的折线图盈让你更好的检查,如果其目前和删除)

arg1: jln.sidomulyo 
arg2: i-vi 
arg3: cepu 
arg4: 58312 

如果我们采取格式化这样

lr.sitimulyo i-vi,ia-iiia,ib-iiib,ic,iic cepu 58312 

行你得到这个(再次ARG1对ARG1换行[0],你需要删除)

arg1: lr.sitimulyo 
arg2: i-vi,ia-iiia,ib-iiib,ic,iic 
arg3: cepu 
arg4: 58312 

在这里,您将需要通过以itterate rg2,当你把它分解成“,”字符并且像这样做那样的信息。

唯一剩下的问题是这些线路

lr.taman siswa i-vii,ia,ib,v/17 cepu 58311 

如果你有一个essentialy 5空格(或更多我猜)和essentialy ARG1需要的一切,直到这部分我假设“一至七,IA, ib,v/17“。应该有这样一个简单的解决方案,但我不能弄明白

哎呦忘了添加行这样

jln.sitimulyo cepu 58312 

Essentialy没有一个ARG4所以你才看出来,如果ARG4为空或犯规存在(不知道它是如何工作在蟒蛇)

GL希望它帮助