Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将非结构化数据从BeautifulSoup解析为结构化数据集_Python_Regex_Parsing_Data Structures_Beautifulsoup - Fatal编程技术网

Python 将非结构化数据从BeautifulSoup解析为结构化数据集

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

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

我将一段数据粘贴到pastebin:

输出数据如下所示,我只是使用管道来分隔字段来说明,我希望这些字段作为输出的单独列:

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