【问题标题】:Parsing Unstructured Data from BeautifulSoup into Structured Datasets将 BeautifulSoup 中的非结构化数据解析为结构化数据集
【发布时间】:2014-11-20 01:33:58
【问题描述】:

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

我将一个 sn-p 数据粘贴到 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)

我已经尝试了几种不同的方法,但甚至还没有达到很远的距离,所以我没有包括那些 sn-ps。我用来获取数据的代码如下:

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'))

【问题讨论】:

    标签: python regex parsing data-structures beautifulsoup


    【解决方案1】:

    它应该是这样工作的:首先,您使用这些正则表达式和补充来使输入文本更易于管理:

    ",[ ]*\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 并像这样输入时,您需要遍历 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 中是如何工作的)

    GL 希望对您有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 2011-03-10
      相关资源
      最近更新 更多