BeautifulSoup html парсинг - PullRequest
       1

BeautifulSoup html парсинг

1 голос
/ 29 января 2020

У меня есть локальный html файл, содержащий контакты. Общая форма контакта:

<div class="pam _3-95 _2pi0 _2lej uiBoxWhite noborder">
  <div class="_3-96 _2pio _2lek _2lel"> NAME </div>
  <div class="_3-96 _2let">
    <div class="_3hls"> PHONE NUMBER</div>
    <div class="_3hls">middle_name: MIDDLE NAME </div>
    <div class="_3hls">note: 0</div>
    <table cellpadding="0" cellspacing="0" class="uiGrid _51mz _21op" style="table-layout: fixed;">
      <tbody>
        <tr class="_51mx">
          <td class="_51m- _2oao">number_times_contacted</td>
          <td class="_51m- _2piu _23bw _51mw">31</td>
        </tr>
        <tr class="_51mx">
          <td class="_51m- _2oao">contact_id</td>
          <td class="_51m- _2piu _23bw _51mw">4914</td>
        </tr>
        <tr class="_51mx">
          <td class="_51m- _2oao">starred</td>
          <td class="_51m- _2piu _23bw _51mw">0</td>
        </tr>
        <tr class="_51mx">
          <td class="_51m- _2oao">last_time_contacted</td>
          <td class="_51m- _2piu _23bw _51mw">1475961803207</td>
        </tr>
        <tr class="_51mx">
          <td class="_51m- _2oao">custom_ringtone</td>
          <td class="_51m- _2piu _23bw _51mw">0</td>
        </tr>
        <tr class="_51mx">
          <td class="_51m- _2oao">in_visible_group</td>
          <td class="_51m- _2piu _23bw _51mw">0</td>
        </tr>
        <tr class="_51mx">
          <td class="_51m- _2oao">send_to_voicemail</td>
          <td class="_51m- _2piu _23bw _51mw">0</td>
        </tr>
        <tr class="_51mx">
          <td class="_51m- _2oao">is_user_profile</td>
          <td class="_51m- _2piu _23bw _51mw">0</td>
        </tr>
      </tbody>
    </table>
  </div>
  <div class="_3-94 _2lem">‏٠١‏/٠٩‏/٢٠١٥ ٢:٢٤ م‏</div>
</div>

Это не постоянно. Это означает, что у меня может быть контакт с: несколькими номерами телефонов - без номера телефона - без дополнительных данных (только его имя и дата).

Я хочу правильно извлечь каждый контакт. Все, что имеет значение, это его имя и номера телефонов, если таковые существуют. Как это сделать с Beautifulsoup?

1 Ответ

2 голосов
/ 29 января 2020

Для меня вы должны использовать регулярное выражение, используя пакет re, чтобы получить то, что вы хотите, потому что у вас есть несколько div только с классом _3hls и нет, один или несколько телефонных номеров.

Регулярное выражение для поиска номера в этом примере взято из здесь

Вы можете сделать что-то вроде этого:

from bs4 import BeautifulSoup as bs4
import re


def validNumber(phone_nuber):
    pattern = re.compile("^[\dA-Z]{3}-[\dA-Z]{3}-[\dA-Z]{4}$", re.IGNORECASE)
    return pattern.match(phone_nuber) is not None

html = """<div class="pam _3-95 _2pi0 _2lej uiBoxWhite noborder">
              <div class="_3-96 _2pio _2lek _2lel"> NAME </div>
                  <div class="_3-96 _2let">
                      <div class="_3hls"> PHONE NUMBER</div>
                      <div class="_3hls">middle_name: MIDDLE NAME </div>
                      <div class="_3hls">note: 0</div>
                      <table cellpadding="0" cellspacing="0" class="uiGrid _51mz _21op" style="table-layout: fixed;">
                          <tbody>
                              <tr class="_51mx">
                                  <td class="_51m- _2oao">number_times_contacted</td>
                                  <td class="_51m- _2piu _23bw _51mw">31</td>
                              </tr>
                              <tr class="_51mx">
                                  <td class="_51m- _2oao">contact_id</td>
                                  <td class="_51m- _2piu _23bw _51mw">4914</td>
                              </tr>
                              <tr class="_51mx">
                                  <td class="_51m- _2oao">starred</td>
                                  <td class="_51m- _2piu _23bw _51mw">0</td>
                              </tr>
                              <tr class="_51mx">
                                  <td class="_51m- _2oao">last_time_contacted</td>
                                  <td class="_51m- _2piu _23bw _51mw">1475961803207</td>
                              </tr>
                              <tr class="_51mx">
                                  <td class="_51m- _2oao">custom_ringtone</td>
                                  <td class="_51m- _2piu _23bw _51mw">0</td>
                              </tr>
                              <tr class="_51mx">
                                  <td class="_51m- _2oao">in_visible_group</td>
                                  <td class="_51m- _2piu _23bw _51mw">0</td>
                              </tr>
                              <tr class="_51mx">
                                  <td class="_51m- _2oao">send_to_voicemail</td>
                                  <td class="_51m- _2piu _23bw _51mw">0</td>
                              </tr>
                              <tr class="_51mx">
                                  <td class="_51m- _2oao">is_user_profile</td>
                                  <td class="_51m- _2piu _23bw _51mw">0</td>
                              </tr>
                          </tbody>
                      </table>
                  </div>
                  <div class="_3-94 _2lem">‏٠١‏/٠٩‏/٢٠١٥ ٢:٢٤ م‏</div>
              </div>"""

contacts = soup.find_all('div', {'class': 'pam _3-95 _2pi0 _2lej uiBoxWhite noborder'})
for contact in contacts:
    name = contact.find('div', {'class': '_3-96 _2pio _2lek _2lel'}).text
    phone_numbers = []
    for div in contact.find_all('div', {'class': '_3hls'}):
        # Test here if div.text is a phone number
        # you can use regex, package...
        if validNumber(div.text):
            phone_numbers.append(div.text)

    print(name)
    print(phone_numbers)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...