@pypyshka

Как при парсинге с помощью bs4 при отсутствии тэга получить ''?

Всем привет!

Столкнулся с такой задачей. При парсинге xml с помощью Beautiful soup получаю неверный результат. Например, есть суп:
<xy:a>
    <xz:b>1</xz:b>
    <xz:d>2</xz:d>
</xy:a>
<xy:a>
    <xz:b>3</xz:b>
    <xz:c>4</xz:c>
    <xz:d>5</xz:d>
</xy:a>

Пытаюсь получить данные:
get_b = soup.find_all("xy:a")
get_b_str = str(get_b)
get_b_re = re.findall(r"<xz:b>(.*?)</xz:b>", get_b_str)

get_c = soup.find_all("xy:a")
get_c_str = str(get_c)
get_c_re = re.findall(r"<xz:c>(.*?)</xz:c>", get_c_str)

get_d = soup.find_all("xy:a")
get_d_str = str(get_d)
get_d_re = re.findall(r"<xz:d>(.*?)</xz:d>", get_d_str)

В итоге получаю: get_b_re = ['1', '3'], get_c_re = ['4'], get_d_re = ['2', '5'].
При попытке вставить эти данные в БД:
result = list(zip_longest(get_b_re, get_c_re, get_d_re, fillvalue=''))
sql = 'INSERT INTO table (b, c, d) VALUES (?, ?, ?)'
cur.executemany(sql, result)

я получаю в таблице:
b | c | d
1 | 4 | 2
3 | - | 5
что неправильно. Можно ли как-то при отсутствии тэга "xz:c" в первом случае получить get_c_re = ['', '4']?
  • Вопрос задан
  • 359 просмотров
Решения вопроса 1
@pypyshka Автор вопроса
В общем я задачу решил так:
for a in soup.find('xy:a').parent.find_all('xy:a'):
    get_b = re.findall(r"<xz:b>(.*?)</xz:b>", str(a))
    get_c = re.findall(r"<xz:c>(.*?)</xz:c>", str(a))
    get_d = re.findall(r"<xz:d>(.*?)</xz:d>", str(a))
    result = list(zip_longest(get_b, get_c, get_d, fillvalue=''))
    sql = 'INSERT INTO table (b, c, d) VALUES (?, ?, ?)'
    cur.executemany(sql, result)

Получаю:
b | c | d
1 | '' | 2
3 | 4 | 5
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
zelsky
@zelsky
<xy:a>
    <xz:b>3</xz:b>
    <xz:c>4</xz:c>
    <xz:d>5</xz:d>
</xy:a>

Если в супе нету пустого значения тогда рсчитывайте размер матрицы и проверяйте на отсутсвие елементов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы