#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
находится в этом списке.