Невозможно отделить два поля от некоторых беспорядочных элементов html

#python #python-3.x #web-scraping #beautifulsoup

#python #python-3.x #очистка веб-страниц #beautifulsoup

Вопрос:

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

 <div class="profile-info__address" itemprop="address" itemscope="" itemtype="http://schema.org/PostalAddress">
            <img src="/Content/images/icons/location-pin.svg" class="icon-left">
            1000 Bruxelles<br>Rue de Laeken 160
        </div>
  

Ожидаемый результат:

 zipcode = 1000
city = Bruxelles
  

Я пробовал с:

 from bs4 import BeautifulSoup

html = """
<div class="profile-info__address" itemprop="address" itemscope="" itemtype="http://schema.org/PostalAddress">
            <img src="/Content/images/icons/location-pin.svg" class="icon-left">
            1000 Bruxelles<br>Rue de Laeken 160
        </div>
"""
soup = BeautifulSoup(html,"html.parser")
address_container = [item.string.strip() for item in soup.select_one("[itemprop='address']") if item.string]
print(address_container)
  

Он выдает:

 ['', '1000 Bruxelles', 'Rue de Laeken 160']
  

Как я могу отделить два поля от адреса?

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

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

1. Всегда ли почтовый индекс перед названием города?

Ответ №1:

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

Например:

 import re

from bs4 import BeautifulSoup

html = """
<div class="profile-info__address" itemprop="address" itemscope="" itemtype="http://schema.org/PostalAddress">
            <img src="/Content/images/icons/location-pin.svg" class="icon-left">
            1000 Bruxelles<br>Rue de Laeken 160
        </div>
"""

soup = BeautifulSoup(html, "html.parser").select_one("[itemprop='address']")
address_container = [item.string.strip() for item in soup if item.string]
filtered_address = [i for i in address_container if re.search(r"^d ", i)]

for item in filtered_address:
    zip_code, city = item.split()
    print(f"Zip: {zip_code}")
    print(f"City: {city}")

  

Вывод:

 Zip: 1000
City: Bruxelles
  

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

1. Да, кажется, это хороший способ. Спасибо.