Как я могу разобрать адрес на его отдельные компоненты?

c# html-agility-pack parsing regex

Вопрос

Мне было поручено создать парсер, который будет анализировать определенную веб-страницу, чтобы наши сотрудники могли делать массовый импорт своих пользовательских данных на свой веб-сайт с нашей компанией.

Я использовал HtmlAgilityPack для синтаксического анализа страницы, я сопоставил данные table row и table data которые были перенесены в свойства в моем классе Map .

Однако одна колонна вызывает у меня много горя. Столбец Адрес - это шип в моей стороне по ряду причин.

Пример данных:

6313 SW 203rd Ave <br> Portland, OR 97224
16600 Lomita Way <br> El Dorado Hills, CA 95762
PO Box #42 <br> Hampton Bays, NY 11946

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

<tr>
     <td> 6313 SW 203rd Ave <br> Portland, OR 97224 </td>
</tr>

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

public string Unit { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }

Однако адреса не обеспечивают значительную привязку:

Проблема первая: Если я якорь у <br> тогда я только разделяющей линии. Не полностью разделяется на соответствующие сегменты.

Второй выпуск: та же проблема с отдельной запятой.

Проблема 3: Если я привяжусь к числовым значениям, для Zip может быть недействительным для Канады и может неправильно разбиться на основе имени улицы.

Каков наилучший способ разделения элементов для адреса? С Regex?

Принятый ответ

Хорошо, поэтому поле « Address было довольно болезненным для синтаксического анализа. Однако мне удалось проанализировать данные на основе моих конкретных требований.

  • Address всегда есть <br> между улицей и городом.

Поэтому я сделал следующее:

var splitBasedOnHTML = Regex.Split(column[2], @"\br<br>");

column[] содержит мой адрес в index two . Поэтому после этого вызова он автоматически позиционирует мой Unit и Street в Index Zero . Город, штат и почтовый Index One будут расположены в Index One .

Итак, я сделал еще один раскол, чтобы сломать город, штат и почву следующим образом:

var splitBasedOnSpace = splitBasedOnHtml[1].Split(' ');

После этого я теперь получаю следующее:

6313 SW 203rd Ave // splitBasedOnHtml[0]
Portland, // splitBasedonSpace[0]
OR // splitBasedOnSpace[1]
97224 // splitBasedOnSpace[2]

Поэтому я просто сопоставил свои свойства с этими индексами отдельных массивов.

Это решение делает предположение о том, что Единица отделена от Улицы , которая становится хорошей жертвой, поскольку данные импортируются на другой веб-сайт и впоследствии могут быть изменены конкретными людьми.

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

    public static Map AddressMapper(IList<string> column)
    {
        var map = new Map();
        var splitBasedOnHTML = Regex.Split(column[2], @"\b<br>");
        var splitBasedOnSpace = splitBasedOnHTML[1].Split(' ');

        map.Street = splitBasedOnHTML[0];
        map.City = splitBasedOnSpace[0].Replace(@",", " ");
        map.State = splitBasedOnSpace[1];
        map.Zip = spliteBasedOnSpace[2];

        return map;
    }

Популярные ответы

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

См. Это другое сообщение для нескольких примеров и более подробное объяснение. Как анализировать уличный / почтовый адрес свободной формы из текста и в компоненты



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow