首页 > 解决方案 > 将抓取的文本拆分为坐标

问题描述

嗨,我正在寻找一些帮助,以使用 python 将一段文本(如下所示)拆分为坐标。我正在使用 scrapy 获取此 d 变量中的数据,我希望对其进行解析以创建成对的 x 和 y 坐标列表以通过 csv 文件导出。理想情况下,当我将 y 值放入列表时,能够操作它们将是最有用的,因为它们不是最终形式(我有一个方程式可以将 y 更改为我想要的值)。我有所有的代码来抓取和导出为 csv,但在此文本的解析方法上寻找一些帮助。

d="M 0 118.46933333333334 L 7.4949494949495 118.98666666666666 L 14.989898989899 113.16666666666667 L 22.484848484848 109.028 L 29.979797979798 108.12266666666667 L 37.474747474747 104.63066666666667 L 44.969696969697 96.35333333333334 L 52.464646464646 95.836 L 59.959595959596 92.86133333333333 L 67.454545454545 91.956 L 74.949494949495 89.628 L 82.444444444444 86.524 L 89.939393939394 86.524 L 97.434343434343 81.60933333333334 L 104.92929292929 82.256 L 112.42424242424 82.77333333333334 L 119.91919191919 81.73866666666667 L 127.41414141414 83.67866666666667 L 134.90909090909 74.108 L 142.40404040404 79.66933333333334 L 149.89898989899 76.436 L 157.39393939394 81.86800000000001 L 164.88888888889 75.14266666666667 L 172.38383838384 77.47066666666667 L 179.87878787879 81.60933333333334 L 187.37373737374 80.05733333333333 L 194.86868686869 86.78266666666667 L 202.36363636364 82.12666666666667 L 209.85858585859 85.10133333333334 L 217.35353535354 85.10133333333334 L 224.84848484848 86.65333333333334 L 232.34343434343 83.93733333333334 L 239.83838383838 87.42933333333333 L 247.33333333333 92.08533333333334 L 254.82828282828 91.82666666666667 L 262.32323232323 95.18933333333334 L 269.81818181818 95.836 L 277.31313131313 94.02533333333334 L 284.80808080808 92.47333333333334 L 292.30303030303 91.43866666666668 L 299.79797979798 86.912 L 307.29292929293 89.88666666666667 L 314.78787878788 90.016 L 322.28282828283 94.80133333333333 L 329.77777777778 87.94666666666667 L 337.27272727273 95.44800000000001 L 344.76767676768 92.21466666666667 L 352.26262626263 90.92133333333334 L 359.75757575758 89.36933333333334 L 367.25252525253 87.04133333333334 L 374.74747474747 90.53333333333333 L 382.24242424242 83.67866666666667 L 389.73737373737 79.54 L 397.23232323232 81.35066666666667 L 404.72727272727 81.35066666666667 L 412.22222222222 82.12666666666667 L 419.71717171717 83.93733333333334 L 427.21212121212 85.10133333333334 L 434.70707070707 85.36 L 442.20202020202 95.44800000000001 L 449.69696969697 91.05066666666667 L 457.19191919192 90.27466666666668 L 464.68686868687 86.26533333333333 L 472.18181818182 86.13600000000001 L 479.67676767677 86.00666666666667 L 487.17171717172 87.30000000000001 L 494.66666666667 81.99733333333334 L 502.16161616162 80.96266666666668 L 509.65656565657 85.23066666666666 L 517.15151515152 81.60933333333334 L 524.64646464646 83.29066666666667 L 532.14141414141 75.14266666666667 L 539.63636363636 72.168 L 547.13131313131 69.71066666666667 L 554.62626262626 76.17733333333334 L 562.12121212121 65.31333333333333 L 569.61616161616 73.33200000000001 L 577.11111111111 72.03866666666667 L 584.60606060606 81.092 L 592.10101010101 76.69466666666668 L 599.59595959596 73.84933333333333 L 607.09090909091 70.09866666666667 L 614.58585858586 72.68533333333333 L 622.08080808081 60.01066666666668 L 629.57575757576 61.17466666666667 L 637.07070707071 63.373333333333335 L 644.56565656566 84.196 L 652.06060606061 84.45466666666667 L 659.55555555556 83.93733333333334 L 667.05050505051 83.42 L 674.54545454545 74.36666666666667 L 682.0404040404 84.71333333333334 L 689.53535353535 81.86800000000001 L 697.0303030303 90.14533333333334 L 704.52525252525 90.016 L 712.0202020202 90.53333333333333 L 719.51515151515 140.71466666666666 L 727.0101010101 145.37066666666666 L 734.50505050505 143.56 L 742 142.784 L 742 194 L 734.50505050505 194 L 727.0101010101 194 L 719.51515151515 194 L 712.0202020202 194 L 704.52525252525 194 L 697.0303030303 194 L 689.53535353535 194 L 682.0404040404 194 L 674.54545454545 194 L 667.05050505051 194 L 659.55555555556 194 L 652.06060606061 194 L 644.56565656566 194 L 637.07070707071 194 L 629.57575757576 194 L 622.08080808081 194 L 614.58585858586 194 L 607.09090909091 194 L 599.59595959596 194 L 592.10101010101 194 L 584.60606060606 194 L 577.11111111111 194 L 569.61616161616 194 L 562.12121212121 194 L 554.62626262626 194 L 547.13131313131 194 L 539.63636363636 194 L 532.14141414141 194 L 524.64646464646 194 L 517.15151515152 194 L 509.65656565657 194 L 502.16161616162 194 L 494.66666666667 194 L 487.17171717172 194 L 479.67676767677 194 L 472.18181818182 194 L 464.68686868687 194 L 457.19191919192 194 L 449.69696969697 194 L 442.20202020202 194 L 434.70707070707 194 L 427.21212121212 194 L 419.71717171717 194 L 412.22222222222 194 L 404.72727272727 194 L 397.23232323232 194 L 389.73737373737 194 L 382.24242424242 194 L 374.74747474747 194 L 367.25252525253 194 L 359.75757575758 194 L 352.26262626263 194 L 344.76767676768 194 L 337.27272727273 194 L 329.77777777778 194 L 322.28282828283 194 L 314.78787878788 194 L 307.29292929293 194 L 299.79797979798 194 L 292.30303030303 194 L 284.80808080808 194 L 277.31313131313 194 L 269.81818181818 194 L 262.32323232323 194 L 254.82828282828 194 L 247.33333333333 194 L 239.83838383838 194 L 232.34343434343 194 L 224.84848484848 194 L 217.35353535354 194 L 209.85858585859 194 L 202.36363636364 194 L 194.86868686869 194 L 187.37373737374 194 L 179.87878787879 194 L 172.38383838384 194 L 164.88888888889 194 L 157.39393939394 194 L 149.89898989899 194 L 142.40404040404 194 L 134.90909090909 194 L 127.41414141414 194 L 119.91919191919 194 L 112.42424242424 194 L 104.92929292929 194 L 97.434343434343 194 L 89.939393939394 194 L 82.444444444444 194 L 74.949494949495 194 L 67.454545454545 194 L 59.959595959596 194 L 52.464646464646 194 L 44.969696969697 194 L 37.474747474747 194 L 29.979797979798 194 L 22.484848484848 194 L 14.989898989899 194 L 7.4949494949495 194 L 0 194"

自从我熟悉通过 python 解析文本以来已经有一段时间了,所以任何建议都值得赞赏!谢谢大家的帮助!

标签: pythoncsvparsingscrapycoordinates

解决方案


我在这里做了 3 个假设:

  1. 和没关系,你只需要坐标ML
  2. 您不在乎以哪种格式获得xy坐标。
  3. 您没有提供要修改的方程式,y所以我只是添加了 1y作为修改。

您可以使用正则表达式来让您回答如下:

import re

# I didn't use the entire `d` string you provided to not fill up the answer with loads of text.
d = """"M 0 118.46933333333334 L 7.4949494949495 118.98666666666666 L 14.989898989899 113.16666666666667 L 22.484848484848 109.028 L 29.979797979798 108.12266666666667 L 37.474747474747 104.63066666666667 L 44.969696969697 96.35333333333334 L 52.464646464646 95.836 L 59.959595959596 92.86133333333333 L 67.454545454545 91.956 L 74.949494949495 89.628 L 82.444444444444 86.524"""

# this is the regular expression that will match `M/L` `X` `Y`
pattern = re.compile(r"[A-Z] (\d*\.?\d*) (\d*\.?\d*) ")

matches = re.findall(pattern, d)

coordinates = list()
for x, y in matches:
    # you didn't provide the y modification equation so I just added 1
    y = float(y) + 1
    x = float(x)
    coordinates.append((x, y))

所以你可以y用你的方程式修改循环中的。最终结果将是一个包含具有和值coordinates的元组的列表。xy


推荐阅读