Python 将非结构化数据从BeautifulSoup解析为结构化数据集
我有一组7个文件,其中包含非结构化数据,我正试图用Python将其解析为7个不同的数据集,这些数据集是我使用beautifulsoup获得的。数据的呈现方式有很多种,我正在努力通过正则表达式或其他解析包找到合适的方法 我将一段数据粘贴到pastebin: 输出数据如下所示,我只是使用管道来分隔字段来说明,我希望这些字段作为输出的单独列:Python 将非结构化数据从BeautifulSoup解析为结构化数据集,python,regex,parsing,data-structures,beautifulsoup,Python,Regex,Parsing,Data Structures,Beautifulsoup,我有一组7个文件,其中包含非结构化数据,我正试图用Python将其解析为7个不同的数据集,这些数据集是我使用beautifulsoup获得的。数据的呈现方式有很多种,我正在努力通过正则表达式或其他解析包找到合适的方法 我将一段数据粘贴到pastebin: 输出数据如下所示,我只是使用管道来分隔字段来说明,我希望这些字段作为输出的单独列: Street | City | Postal Code jln.sidomulyo i-vi | cepu | 58312 jln.sitimulyo
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)句点后的空白。西蒂穆利奥vs.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'))
其工作原理如下:首先,使用这些正则表达式和Replecement使输入文本更易于管理:
",[ ]*\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]"
您会看到注释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
在这里,当您通过、char将arg2拆分并使entrys像这样时,您需要通过arg2进行初始化
剩下的唯一问题就是这些线路
lr.taman siswa i-vii,ia,ib,v/17 cepu 58311
我猜基本上有5个或更多的空格,基本上arg1需要所有的空格,直到这部分我假设i-vii,ia,ib,v/17。应该有一个简单的解决办法,但我想不出来
哎哟,忘了加这样的台词了
jln.sitimulyo cepu 58312
基本上没有arg4,所以您只需查看arg4是否为空或不存在,而不知道它在python中是如何工作的
希望有帮助
jln.sitimulyo cepu 58312