Python 字符串块格式化挑战

Python 字符串块格式化挑战,python,string,shell,formatting,awk,Python,String,Shell,Formatting,Awk,我正在研究一种从美国国家地震信息中心(USGS)自动下载地震参数的方法。不幸的是,他们的格式是一堆废话,我不认为我会有太多的运气说服他们改变他们的格式。因此,我必须格式化他们的 curl --silent http://earthquake.usgs.gov/earthquakes/eqinthenews/2010/uu00002715/uu00002715_gcmt.php |\ sed -n '/<pre>/,/<\/pre>/p' |\ egrep -v '(#)|

我正在研究一种从美国国家地震信息中心(USGS)自动下载地震参数的方法。不幸的是,他们的格式是一堆废话,我不认为我会有太多的运气说服他们改变他们的格式。因此,我必须格式化他们的

curl --silent http://earthquake.usgs.gov/earthquakes/eqinthenews/2010/uu00002715/uu00002715_gcmt.php |\
sed -n '/<pre>/,/<\/pre>/p' |\
egrep -v '(#)|(pre>)' |\
egrep '(MW)|(ORIGIN)|(LAT)|(DEP)|(BEST DBLE)|(NP1)'
我想要这样的格式:

name  date           time        lon      lat     dep   dep_err  Mw   M0           strike  dip  slip
UTAH  April 15 2010  23:59:42.8  110.86W  41.72N  12.5  1.8      4.6  1.07*10**23  193     35   -80
注:经度将转换为东经(因此符号发生变化)


我希望解决方案是使用
awk
python
unixshell
命令,但我愿意使用
ruby
perl
(我可能不明白发生了什么)。

为什么不使用他们的一个XML格式提要,例如。我确信它更容易解析。

为什么不使用他们的XML格式提要,例如。我确信它更容易解析。

这里有一个awk脚本,它可以帮助您完成大部分工作。将Lon、日期、M0等的转换留作练习:

import httplib2
import re
from xlwt import Workbook

h = httplib2.Http(".cache")
url = 'http://earthquake.usgs.gov/earthquakes/eqinthenews/2010/uu00002715/uu00002715_gcmt.php'
resp, content = h.request(url, "GET")
regex = re.compile("<pre>\s*(?P<date>.* \d{2}, \d{4}), (?P<name>\w.*), MW=(?P<Mw>\d.\d).*ORIGIN TIME:\s*(?P<time>\d{2}:\d{2}:\d{2}.\d).*LAT:\s*(?P<lat>\d{2,3}.\d{2,3}[N|S]).*LON:\s*(?P<lon>\d{2,3}.\d{2,3}[W|E]).*DEP:\s*(?P<dep>\d{2,3}.\d)\s*(?P<dep_err>\d{1,3}.\d);.*M0=\s*(?P<M0>\d.\d{1,2}\*\d{1,2}\*\*\d{1,2}).*STRIKE=(?P<strike>\d{1,3}).*DIP=(?P<dip>\d{1,3}).*SLIP=\s*(?P<slip>[-|+]\d{1,3}).*NP2",re.MULTILINE|re.DOTALL)
r = regex.search(content)
data = r.groupdict()

headers = ['name', 'date', 'time', 'lon', 'lat', 'dep', 'dep_err', 'Mw', 'M0', 'strike', 'dip', 'slip']
wb = Workbook()
ws = wb.add_sheet('Quakes')

column = 0
for header in headers:
    ws.write(0, column, header)
    ws.write(1, column,data[header])
    column+=1
wb.save('quakes.xls')

这里有一个awk脚本,它可以让您在大部分时间内达到目的。将Lon、日期、M0等的转换留作练习:

import httplib2
import re
from xlwt import Workbook

h = httplib2.Http(".cache")
url = 'http://earthquake.usgs.gov/earthquakes/eqinthenews/2010/uu00002715/uu00002715_gcmt.php'
resp, content = h.request(url, "GET")
regex = re.compile("<pre>\s*(?P<date>.* \d{2}, \d{4}), (?P<name>\w.*), MW=(?P<Mw>\d.\d).*ORIGIN TIME:\s*(?P<time>\d{2}:\d{2}:\d{2}.\d).*LAT:\s*(?P<lat>\d{2,3}.\d{2,3}[N|S]).*LON:\s*(?P<lon>\d{2,3}.\d{2,3}[W|E]).*DEP:\s*(?P<dep>\d{2,3}.\d)\s*(?P<dep_err>\d{1,3}.\d);.*M0=\s*(?P<M0>\d.\d{1,2}\*\d{1,2}\*\*\d{1,2}).*STRIKE=(?P<strike>\d{1,3}).*DIP=(?P<dip>\d{1,3}).*SLIP=\s*(?P<slip>[-|+]\d{1,3}).*NP2",re.MULTILINE|re.DOTALL)
r = regex.search(content)
data = r.groupdict()

headers = ['name', 'date', 'time', 'lon', 'lat', 'dep', 'dep_err', 'Mw', 'M0', 'strike', 'dip', 'slip']
wb = Workbook()
ws = wb.add_sheet('Quakes')

column = 0
for header in headers:
    ws.write(0, column, header)
    ws.write(1, column,data[header])
    column+=1
wb.save('quakes.xls')

用正则表达式解析html通常被视为一个非常非常糟糕的主意,因此我支持Abizern关于使用RSS提要的建议。事实上,美国地质勘探局也提供XML下载(请参阅)

如果出于某种原因您不能这样做,并且必须使用html,那么由于
块没有进一步的结构(排除了使用lxml或beautifulsoup之类的好方法),那么下面的python适用于这个示例……正则表达式可能非常脆弱(坦率地说,是Cludge)并且需要调整以处理更多的示例/异常

这会写入一个excel文件,因此您应该能够在循环中弹出所有内容以刮取多个页面(很好地播放并检查它们的条款,限制速率和缓存)

导入httplib2
进口稀土
从xlwt导入工作簿
h=httplib2.Http(“.cache”)
url='1〕http://earthquake.usgs.gov/earthquakes/eqinthenews/2010/uu00002715/uu00002715_gcmt.php'
resp,content=h.request(url,“GET”)
(P\w.),MW=(P\P\P\d.d.d.)*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:(P\d{{2{{2{{2{{2{2{3{3}::::::....[[3...[3....[3.[3..[3..[3...[3....[3.......*拉泰::::::下列下列下列下列::::::::::::::::::::::::::下列以下以下以下以下以下以下以下以下以下以下以下以下以下以下::::::::::::::::::::::[1,3}.\d];*M0=\s*(?P\d.\d{1,2}.*\d{1,2}.*\d{1,2})。*走向=(?P\d{1,3})。*倾角=(?P\d{1,3})。*滑移=\s*(?P[-+]\d{1,3}.*NP2',re.MULTILINE | re.DOTALL)
r=regex.search(内容)
data=r.groupdict()
标题=['name'、'date'、'time'、'lon'、'lat'、'dep'、'dep_err'、'Mw'、'M0'、'strike'、'dip'、'slip']
wb=工作簿()
ws=wb.add_表(“地震”)
列=0
对于标题中的标题:
write(0,列,标题)
write(1,列,数据[头])
列+=1
wb.save('quakes.xls')

当然,你应该使用XML/RSS,但是如果可以的话:)

用正则表达式解析html通常被认为是一个非常非常糟糕的主意,所以我支持Abizern关于使用RSS提要的建议。事实上,美国地质勘探局也提供XML下载(请参阅)

如果出于某种原因您不能这样做,并且必须使用html,那么由于
块没有进一步的结构(排除了使用lxml或beautifulsoup之类的好方法),那么下面的python适用于这个示例……正则表达式可能非常脆弱(坦率地说,是Cludge)并且需要调整以处理更多的示例/异常

这会写入一个excel文件,因此您应该能够在循环中弹出所有内容以刮取多个页面(很好地播放并检查它们的条款,限制速率和缓存)

导入httplib2
进口稀土
从xlwt导入工作簿
h=httplib2.Http(“.cache”)
url='1〕http://earthquake.usgs.gov/earthquakes/eqinthenews/2010/uu00002715/uu00002715_gcmt.php'
resp,content=h.request(url,“GET”)
(P\w.),MW=(P\P\P\d.d.d.)*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:*起源时间:(P\d{{2{{2{{2{{2{2{3{3}::::::....[[3...[3....[3.[3..[3..[3...[3....[3.......*拉泰::::::下列下列下列下列::::::::::::::::::::::::::下列以下以下以下以下以下以下以下以下以下以下以下以下以下以下::::::::::::::::::::::[1,3}.\d];*M0=\s*(?P\d.\d{1,2}.*\d{1,2}.*\d{1,2})。*走向=(?P\d{1,3})。*倾角=(?P\d{1,3})。*滑移=\s*(?P[-+]\d{1,3}.*NP2',re.MULTILINE | re.DOTALL)
r=regex.search(内容)
data=r.groupdict()
标题=['name'、'date'、'time'、'lon'、'lat'、'dep'、'dep_err'、'Mw'、'M0'、'strike'、'dip'、'slip']
wb=工作簿()
ws=wb.add_表(“地震”)
列=0
对于标题中的标题:
write(0,列,标题)
write(1,列,数据[头])
列+=1
wb.save('quakes.xls')

当然,你应该使用XML/RSS,如果可以的话:)

我很感谢你的建议。问题是科学的:我需要确保他们发布(我正在使用)的解决方案是最终评估,而不是初步评估。在很多情况下,他们发布的模型需要数小时到数天的时间来完善,所以我不能依赖即时RSS提要。我很感激这个建议。问题是科学的:我需要确保他们发布(我正在使用)的解决方案是最终评估,而不是初步评估。在很多情况下,他们发布的模型需要数小时到数天的时间来完善,所以我不能依赖即时RSS提要。我感到很谦卑。非常感谢你!我很谦卑。非常感谢你!这是一个非常好的解决方案@craigs。问题是,是的,我必须使用html(见我对@Abizern的回复)。这是一个非常好的解决方案@craigs。问题是,是的,我必须使用html(请参阅我对@Abizern的响应)。
name  date           time        lon      lat     dep   dep_err  Mw   M0           strike  dip  slip
UTAH  April 15 2010  23:59:42.8  110.86W  41.72N  12.5  1.8      4.6  1.07*10**23  193     35   -80
import httplib2
import re
from xlwt import Workbook

h = httplib2.Http(".cache")
url = 'http://earthquake.usgs.gov/earthquakes/eqinthenews/2010/uu00002715/uu00002715_gcmt.php'
resp, content = h.request(url, "GET")
regex = re.compile("<pre>\s*(?P<date>.* \d{2}, \d{4}), (?P<name>\w.*), MW=(?P<Mw>\d.\d).*ORIGIN TIME:\s*(?P<time>\d{2}:\d{2}:\d{2}.\d).*LAT:\s*(?P<lat>\d{2,3}.\d{2,3}[N|S]).*LON:\s*(?P<lon>\d{2,3}.\d{2,3}[W|E]).*DEP:\s*(?P<dep>\d{2,3}.\d)\s*(?P<dep_err>\d{1,3}.\d);.*M0=\s*(?P<M0>\d.\d{1,2}\*\d{1,2}\*\*\d{1,2}).*STRIKE=(?P<strike>\d{1,3}).*DIP=(?P<dip>\d{1,3}).*SLIP=\s*(?P<slip>[-|+]\d{1,3}).*NP2",re.MULTILINE|re.DOTALL)
r = regex.search(content)
data = r.groupdict()

headers = ['name', 'date', 'time', 'lon', 'lat', 'dep', 'dep_err', 'Mw', 'M0', 'strike', 'dip', 'slip']
wb = Workbook()
ws = wb.add_sheet('Quakes')

column = 0
for header in headers:
    ws.write(0, column, header)
    ws.write(1, column,data[header])
    column+=1
wb.save('quakes.xls')