очистка данных из webscraper

#python #numpy #dictionary

#python #numpy #словарь

Вопрос:

Я создавал webscraper, и в конечном итоге я хотел бы получить его для пар ключ-значение из-за способа настройки данных, вот пример первого вывода из этого webscraper и того, что я сделал до сих пор для очистки данных:

 # each pass of the webscraper appends the wrapper table to a table
# the first entry looks like this:
new_set5001[0]=
"About 403 W Main Street, Cleveland, MO 64734nDirections:From Kansas City-South to Cleveland Mo., D-Highway amp; Y-Highway turn west onto Main St., go through the the 4 way stop. home is on the south side (left). From Kansas us 69 Highway amp; 247th St. exit, east to Cleveland to the house on the south side.nGeneral DescriptionnMLS Numbern2225041nCountynCassnCitynClevelandnSub DivnClevelandnTypenSingle FamilynFloor Plan DescriptionnRanchnBdrmsn3nBaths Fulln1nBaths Halfn1nAge Descriptionn101 Years/MorenYear Builtn1900nSqft Mainn1307nSQFT MAIN SOURCEnPublic RecordnBelow Grade Finished Sq Ftn0nBelow Grade Finished Sq Ft SourcenPublic RecordnSqftn1307nLot Sizen100' X 172'nSchool DistrictnCass-MidwaynS TermsnCashnInterior FeaturesnFireplace?nYnFireplace DescriptionnLiving RoomnBasementnNnBasement DescriptionnCrawl SpacenDining Area DescriptionnEat-In KitchennUtility RoomnOff The KitchennInterior FeaturesnFixer Up, Partial CarpetingnExterior / ConstructionnGarage/Parking?nNnConstructionnBrick Trim, FramenArchitecturenOthernRoofnCompositionnLot DescriptionnCity LotnIn FloodplainnNonInside City LimitsnYesnStreet MaintenancenPavednExterior FeaturesnFixer UpnUtility InformationnCentral AirnNnHeatnNatural GasnCoolnNonenWaternCity/PublicnSewernCity/PublicnFinancial InformationnS TermsnCashnHoa Amountn$0nTaxn$1,005nSpecial Taxn$0nTotal Taxn$1,005nType Of OwnershipnPrivatenWill SellnCash, Conventional"

# next I split the lines 

new_set5001a = []
for i in range(len(new_set5001)):
    new_set5001a.append(new_set5001[i].splitlines())
#this yields a nested list
# passed these to a list of arrays for operations

np_arrrays = []
for array in new_set5001a:
    np_arrays.append(np.array(array))
  

теперь, работая по одному массиву 1 за раз, я получаю именно то, что мне нужно, из следующей функции

 def clean_data(arr, feature_list):

    new = []
    
    for val in feature_list:
        try:
            y = (np.argwhere(arr==val) 1).flatten()
            z = np.where(arr==val, arr[y], None)
            z1 = z[z!=None][0]
            new.append(z1)
        except:
            new.append(None)
    return dict(zip(feature_list, new))

feature_list = ['MLS Number','County', 'City', 'Sub Div', 'Type',
        'Floor Plan Description', 'Bdrms',
       'Baths Full', 'Baths Half','Year Built', 'Sqft Main', 
       'SQFT MAIN SOURCE', 'Below Grade Finished Sq Ft',
       'Below Grade Finished Sq Ft Source', 'Lot Size', 'School District',
       'Fireplace?', 'Fireplace Description',
       'Basement', 'Basement Description',
       'Garage/Parking?', 'Construction', 
       'Architecture', 'Roof',  'Lot Description',
      'In Floodplain', 'Inside City Limits', 
       'Street Maintenance','Central Air', 'Heat', 
       'Cool', 'Water','Sewer']

clean_data(np_arrays[0], feature_list)
{'MLS Number': '2212446',
 'County': 'Cass',
 'City': 'Garden City',
 'Sub Div': 'Hedge Trails',
 'Type': 'Single Family',
 'Floor Plan Description': 'Ranch',
 'Bdrms': '2',
 'Baths Full': '1',
 'Baths Half': '0',
 'Year Built': '1974',
 'Sqft Main': '960',
 'SQFT MAIN SOURCE': 'Public Record',
 'Below Grade Finished Sq Ft': '0',
 'Below Grade Finished Sq Ft Source': 'Public Record',
 'Lot Size': '78x120',
 'School District': 'Sherwood',
 'Fireplace?': 'N',
 'Fireplace Description': None,
 'Basement': 'N',
 'Basement Description': 'Crawl Space',
 'Garage/Parking?': 'Y',
 'Construction': 'Frame, Vinyl Siding',
 'Architecture': 'Traditional',
 'Roof': 'Composition',
 'Lot Description': 'City Lot, Corner Lot',
 'In Floodplain': 'No',
 'Inside City Limits': None,
 'Street Maintenance': None,
 'Central Air': 'Y',
 'Heat': 'Forced Air Gas, Natural Gas',
 'Cool': 'Central Electric',
 'Water': 'City/Public',
 'Sewer': 'City/Public'}
  

Теперь мой подход заключается в повторном цикле и получении списка пар ключ-значение, но я еще не совсем там

 
new2 = []
for i in range(len(new_set5001a)):
    x = np_arrays[i]
    for val in feature_list:
        try:
            y = (np.argwhere(x==val) 1).flatten()
            z = np.where(x==val, x[y], None)
            z1 = z[z!=None][0]
            new2.append({val:z1})
        except:
            new2.append({val:None})
  

итак, результат new2 выглядит следующим образом:

 [{'MLS Number': '2225041'},
 {'County': 'Cass'},
 {'City': 'Cleveland'},
 {'Sub Div': 'Cleveland'},
 {'Type': 'Single Family'},
 {'Floor Plan Description': 'Ranch'},
 {'Bdrms': '3'},
 {'Baths Full': '1'},
 {'Baths Half': '1'},
 {'Year Built': '1900'},
 {'Sqft Main': '1307'},
 {'SQFT MAIN SOURCE': 'Public Record'},
 {'Below Grade Finished Sq Ft': '0'},
 {'Below Grade Finished Sq Ft Source': 'Public Record'},
 {'Lot Size': "100' X 172'"},
 {'School District': 'Cass-Midway'},
 {'Fireplace?': 'Y'},
 {'Fireplace Description': 'Living Room'},
 {'Basement': 'N'},
 {'Basement Description': 'Crawl Space'},
 {'Garage/Parking?': 'N'},
 {'Construction': 'Brick Trim, Frame'},
 {'Architecture': 'Other'},
 {'Roof': 'Composition'},
 {'Lot Description': 'City Lot'},
 {'In Floodplain': 'No'},
 {'Inside City Limits': 'Yes'},
 {'Street Maintenance': 'Paved'},
 {'Central Air': 'N'},
 {'Heat': 'Natural Gas'},
 {'Cool': 'None'},
 {'Water': 'City/Public'},
 {'Sewer': 'City/Public'},
 {'MLS Number': '2212446'},
 {'County': 'Cass'},
 {'City': 'Garden City'},
 {'Sub Div': 'Hedge Trails'},
 {'Type': 'Single Family'},
 {'Floor Plan Description': 'Ranch'},
 {'Bdrms': '2'},
 {'Baths Full': '1'},
 {'Baths Half': '0'},
 {'Year Built': '1974'},
 {'Sqft Main': '960'},
 {'SQFT MAIN SOURCE': 'Public Record'},
 {'Below Grade Finished Sq Ft': '0'},
 {'Below Grade Finished Sq Ft Source': 'Public Record'},
 {'Lot Size': '78x120'},
 {'School District': 'Sherwood'},
 {'Fireplace?': 'N'},
 {'Fireplace Description': None},
 {'Basement': 'N'},
 {'Basement Description': 'Crawl Space'},
 {'Garage/Parking?': 'Y'},
 {'Construction': 'Frame, Vinyl Siding'},
 {'Architecture': 'Traditional'},
 {'Roof': 'Composition'},
 {'Lot Description': 'City Lot, Corner Lot'},
 {'In Floodplain': 'No'},
 {'Inside City Limits': None},
 {'Street Maintenance': None},
 {'Central Air': 'Y'},
 {'Heat': 'Forced Air Gas, Natural Gas'},
 {'Cool': 'Central Electric'},
 {'Water': 'City/Public'},
 {'Sewer': 'City/Public'}]
  

Итак, я вижу, что это не совсем правильно, но я не знаю, как действовать дальше

Комментарии:

1. почему вы используете r'xx' для строки замены, но не для строки регулярного выражения

2. Судя по тому, что вы написали, вам нужно \n(.*?)\n и заменить на :$1,n в VSCode.

3. Замените на ': '$1',n' и используйте регулярное выражение find @Wiktor. См . regex101.com/r/76SZEl/1 и просто удалите 'general description': его в самом начале вручную. Возможно, последнюю запись также придется исправить вручную.

4. Кроме того, как вы видите из демонстрации regex101, ваши данные намного сложнее, чем кажется на первый взгляд — я думаю, что будет много работы, чтобы сделать это правильно в одном регулярном выражении.

5. Я собирался опубликовать ответ для вас, пока не обнаружил, что строка 3 вашего первого примера имеет неравномерное число. Итак, splash 1. RoomsnLiving RoomnLevel 1nKitchennLevel 1nLiving Rm- 2ndnLevel BnBathroom FullnLevel 1nMaster BedroomnLevel 1nMaster BathroomnLevel 1nSecond BedroomnLevel 1nThird BedroomnLevel 1nFourth BedroomnLevel Bn2nd Full BathnLevel B

Ответ №1:

Необходимо выполнить три отдельных регулярных выражения. Но сейчас это спорный вопрос, как я уже сказал в своих комментариях:

строка 3 вашего первого примера имеет неравномерное число.
RoomsnLiving RoomnLevel 1nKitchennLevel 1nLiving Rm- 2ndnLevel BnBathroom FullnLevel 1nMaster BedroomnLevel 1nMaster BathroomnLevel 1nSecond BedroomnLevel 1nThird BedroomnLevel 1nFourth BedroomnLevel Bn2nd Full BathnLevel B

Итак, в основном 3-е регулярное выражение смещается на 1, что имеет огромное значение.

Регулярное выражение 1: (?:[{|}]|[^Srn]*'[^']*'s*:s*) заменить пустой строкой.
https://regex101.com/r/827EYK/1

Регулярное выражение 2: (?m)s*'s*(.*?)s*'s*(?:,s*|$) заменить на r"1\n"
https://regex101.com/r/TyuDMt/1

Регулярное выражение 3: (.*?)\n(.*?)\n заменить на r'"1":"2", rn'
https://regex101.com/r/zoroi7/1


Чтобы исправить это с помощью неравномерных чисел (т.Е. половина пары), вы можете
, по крайней мере, прижечь его и идентифицировать на уровне строки.
Требуется другое регулярное выражение 2 и промежуточное для добавления
дополнительной полупары, чтобы, по крайней мере, оно не переливалось и не загрязняло следующую строку.

Это просто зависит от того, как далеко вы хотите зайти с этим.
Очевидно, что проверка пары может быть выполнена в самом начале
с помощью одного регулярного выражения. Существует несколько вариантов того, что вы можете с этим сделать.