Как создать список кортежей из данных BeautifulSoup в Python?

#python #web-scraping #beautifulsoup #data-science

#python #соскабливание полотна #beautifulsoup #наука о данных

Вопрос:

Я хочу создать список кортежей:

Требуемый вывод

 d = [('Red','Apple'),('Green','Apple'),('Yellow','Banana'),('Blue','Berry')]
 

HTML содержит

 <h2>
    <span class="head" id="Fruit">Apple</span>
</h2>
<ol>
    <li>
        <a href = "/red" title="Red">Red</a>
        <a href = "/rot" title="Rot">Rot</a>
    </li>
    <li>
        <a href = "/green" title="Green">Green</a>
    </li>
</ol>
<h2>
    <span class="head" id="Banana">Banana</span>
</h2>
<ol>
    <li>
        <a href = "/yellow" title="Yellow">Yellow</a>
    </li>
</ol>
<h2>
    <span class="head" id="Berry">Berry</span>
</h2>
<ol>
    <li>
        <a href = "/blue" title="Blue">Blue</a>
    </li>
</ol>
<h2>
    <span class="head" id="Not">NotRequired</span>
</h2>
 

Я попытался, однако, смог получить данные отдельно. И не смог удалить заголовки, которые не были необходимы. Кроме того, поскольку список генерируется отдельно, сопоставление затруднено.

 box1 = []
box2 = []
for dat in body.find_all(class_ = "head"):
    temp = str(dat)
    x = temp.split(">")[1]
    box1.append(x.split("<")[0])
for dat in body.select("ol > li > a:nth-of-type(1)"):
    temp = str(dat)
    y = temp.split(">")[1]
    box2.append(y.split("<")[0])
 

Сгенерированный вывод

 ['Apple','Banana','Berry','NotRequired']

['Red','Green','Yellow','Blue']
 

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

1. Почему это ('Red','Apple') не ('Red','Rot','Apple') так?

2. Потому что я хочу извлечь только первый тег <a> из всех тегов <li> .

Ответ №1:

Используйте soup.FindNext(class_=»head»)

и создайте кортеж в каждом из этих вызовов

то, как вы это делаете, вы не можете отличить, потому что вы не знаете, сколько у вас фруктов каждого типа в терминах списка цветов

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

1. Привет, спасибо. У меня появилась идея. Тем не менее, это становится несколько трудным для меня, поскольку я новичок в этом деле. Не могли бы вы, пожалуйста, помочь с каким-нибудь кодом?

2. после вызова soup.FindNext(class_=»head») найдите все цвета в этом заголовке (fruit), для каждого цвета добавьте (fruit, colorname) в список

Ответ №2:

Вы могли бы использовать zip функцию (https://docs.python.org/3.3/library/functions.html#zip )

 >>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> list(zipped)
[(1, 4), (2, 5), (3, 6)]
 

Итак, в вашем случае

 desired_output = list(zip(box2, box1))
 

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

1. Этого недостаточно, NotRequired находится в этом списке.