我有一组包含非结构化数据的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'))
答案 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希望它有所帮助