将BeautifulSoup中的非结构化数据解析为结构化数据集

时间:2014-09-25 10:05:57

标签: python regex parsing data-structures beautifulsoup

我有一组包含非结构化数据的7个文件,我试图将其解析为使用beautifulsoup获得的Python中的7个不同数据集。数据呈现的方式有很多种,我很难通过正则表达式或其他解析包找到合适的方法。

我将一段数据粘贴到pastebin: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)在两个字母前缀的句号之后消除空格(例如,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'))

1 个答案:

答案 0 :(得分:0)

以下是它应该如何工作:首先,您使用这些正则表达式和重新分类来使输入文本更易于管理:

",[ ]*\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实际上有一个新的折线图,所以你最好检查它的存在并删除它)

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

在这里你需要通过arg2进行迭代,当你通过“,”字符分割它时,并按照这样的方式进行修改。

唯一的问题是这些行

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

你有一个必要的5个空格(或者更多我猜)和essentialy arg1需要一切,直到这部分我假设“i-vii,ia,ib,v / 17”。应该有一个简单的解决方案,但我无法弄清楚

哎呀忘了添加这样的行

jln.sitimulyo cepu 58312 

Essentialy没有arg4,所以你只需看看arg4是空的还是不存在(不知道它在python中是如何工作的)

GL希望它有所帮助