Как очистить этот кусок HTML с помощью BS - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь очистить следующий вид HTML в BeautifulSoup.

<div …. > <div…..>
<div class=“class1">Jill</div> <div class=“class2">50</div>
<div class=“class1">Jane</div>
<div class=“class1">Joe</div>  <div class=“class2">12</div>
</div></div>

Не у каждого человека есть второй элемент для очистки, поэтому такие вещи, как soup.find_all ("div", attrs = {"class": "class2"}) не будут работать правильно (будут возвращены оба50 и 12, но 12 не связан с нужным человеком)

Требуемый результат (в переменных):

Jill 50 Jane Joe 12

Ответы [ 3 ]

1 голос
/ 27 сентября 2019

Вы можете получить все элементы name ('class1') и проверить, имеют ли они соответствующий элемент age ('class2').

from bs4 import BeautifulSoup

html = """
<div class='parent'>
    <div class="class1">Jill</div> <div class="class2">50</div>
    <div class="class1">Jane</div>
    <div class="class1">Joe</div> <div class="class2">12</div>
</div>
"""

soup = BeautifulSoup(html)

name_tags = soup.find_all('div', {'class': 'class1'})

name_age_pairs = []

# Iterate through all 'class1' elements and see if the next sibling is 'class2'
for name_tag in name_tags:
    name_next_div = name_tag.find_next('div')
    age = None
    if 'class2' in name_next_div['class']:
        age = int(name_next_div.string)
    name_age_pairs.append((name_tag.string, age))

print(name_age_pairs)

name_age_pairs будет содержать:

[('Jill', 50), ('Jane', None), ('Joe', 12)]

Где «Нет» означает, что возраст не связан со вторым человеком.

0 голосов
/ 28 сентября 2019

Это то, что я наконец-то использовал.Работает для нескольких значений и пробелов в именах классов.

# default values for vars
Item1 = Item2 = Item3 = ""

for item in soup.find_all('div'):

    # convert to str for comparison reasons
    strItem = str(item)

    if strItem.find("class1") > 0 and item.string != None:

        if Item1 != "": # if you have None as default change this
            print(Item1, Item2, Item3) # or make list, dict, json, csv, sql......

        Item2 = Item3 = "" # default values for vars
        Item1 = item.string

    elif strItem.find("class2") > 0 and item.string != None:
        Item2 = item.string

    elif strItem.find("class3") > 0 and item.string != None:
        Item3 = item.string

    # and so on....

# don't forget to process the last one...
print(Item1, Item2, Item3) # # or make list, dict, json, csv, sql......
0 голосов
/ 27 сентября 2019

Попробуйте это:

pairs = []
for div in soup.find_all('div', {'class': 'class1'}):
    name = div.text
    item = ''
    tmp = div.find_next('div')
    if 'class2' in tmp['class']:
        item = tmp.text
    pairs.append([name, item])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...