Извлечение информации из списка html в pandas df / list / dict (python 3.0) - PullRequest
0 голосов
/ 02 мая 2018

У меня есть исходный код сайта, который содержит несколько списков. Теперь я хотел бы извлечь информацию из этих списков в пригодный для использования формат в python.

Например, см. Первую запись списка в списке стран ниже:

<ul class='checklist__list'>

    <li class=' checklist__item' id='checklist__item--country-111'>
      <label class='checklist__label ripple-animation'>
        <input  class="checklist__input js-checklist__input idb-on-change" type="checkbox" id="111" name="country" value="111">
          Germany
        </input>
      </label>
    </li>

Скажем, меня сейчас интересует идентификатор страны (здесь: 111) и соответствующее название страны (здесь: Германия), и я хотел бы иметь его в удобном для использования формате на python, например, в фрейме данных или словаре pandas.

Кто-нибудь знает простой способ сделать это? Оригинальный список содержит> 100 стран.

Большое спасибо за предложения!

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете легко решить эту проблему с BeautifulSoup. Учитывая разметку, которую вы разместили в своем вопросе, этот фрагмент кода должен извлечь id и label:

from bs4 import BeautifulSoup as bs
html = """<ul class='checklist__list'>
            <li class=' checklist__item' id='checklist__item--country-111'>
              <label class='checklist__label ripple-animation'>
              <input  class="checklist__input js-checklist__input idb-on-change" type="checkbox" id="111" name="country" value="111">
                Germany
              </input>
              </label>
            </li>"""

soup = bs(html)
label = soup.find("label").text
id = soup.find("input").get("value")

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

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

lis = soup.find_all("li")  # This will return a list of all line items in the markup.
for li in lis:
    li_label = li.find("label").text
    li_id = li.find("input").get("id")
    print(li_label, li_id)
...