Python BeautifulSoup циклически просматривая данные таблиц - PullRequest
0 голосов
/ 17 января 2019

Очень новый для Python здесь.Я пытаюсь получить некоторые данные с этой страницы с этой страницы .Я пытаюсь получить имя элемента и тип элемента в двух списках.Я могу выяснить, как объединить их в один стол позже.Любая помощь была бы отличной!

Строки кода работают сами по себе, но цикл не работает для меня.Это приводит к успешному созданию двух строк кода:

import urllib
import bs4 as bs

sauce = urllib.request.urlopen('https://us.diablo3.com/en/item/helm/').read()
soup = bs.BeautifulSoup(sauce, 'lxml')

item_details =  soup.find('tbody')
print(item_details) 

item_name = item_details.find('div', class_='item-details').h3.a.text
print(item_name)

item_type = item_details.find('ul', class_='item-type').span.text
print(item_type)

Это повторяет значение первого имени элемента снова и снова:

for div in soup.find_all('div', class_='item-details'):
    item_name = item_details.find('div', class_='item-details').h3.a.text
    print(item_name)
    item_type = item_details.find('ul', class_='item-type').span.text
    print(item_type)

Это вывод:

Veil of Steel
Magic Helm
Veil of Steel
Magic Helm
Veil of Steel
Magic Helm
Veil of Steel
Magic Helm
Veil of Steel
Magic Helm
Veil of Steel
Magic Helm
Veil of Steel
Magic Helm
...

Ответы [ 3 ]

0 голосов
/ 17 января 2019

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

item_details = []
for sections in soup.select('.item-details'):
    item_name = sections.select_one('h3[class*="subheader-"]').text.strip()  # partial match subheader-1, subheader-2, ....
    item_type = sections.select_one('ul[class="item-type"]').text.strip()
    item_details.append([item_name, item_type])

print(item_details)

вывод

[['Завеса из стали', 'Магический шлем'], ["Корона Леорика", "Легендарный шлем"], ....

0 голосов
/ 17 января 2019

Это работает:

sauce = urllib.request.urlopen('https://us.diablo3.com/en/item/helm/').read()
soup = bs.BeautifulSoup(sauce, 'lxml')

item_names = soup.find_all('div', class_='item-details')
for ele in item_names:
   print(ele.h3.a.text)

item_type = soup.find_all('ul', class_='item-type')
for ele in item_type:
    print(ele.span.text)

Почему ваш код не работал:

Похоже, что вместо перебора всех элементов ваш код продолжал извлекать один и тот же элемент (find_all для всех элементов).

0 голосов
/ 17 января 2019

Вам нужно использовать find_all (возвращает список) вместо find (возвращает один элемент):

for i, j in zip(item_details.find_all('div', class_='item-details'), item_details.find_all('ul', class_='item-type')):
    print(i.h3.a.text, " - ", j.span.text)

Вывод:

Veil of Steel  -  Magic Helm
Leoric's Crown  -  Legendary Helm
Harlequin Crest  -  Magic Helm
The Undead Crown  -  Magic Helm
...

или в более читаемом формате:

names = item_details.find_all('div', class_='item-details')
types = item_details.find_all('ul', class_='item-type')

for name, type in zip(names, types):
    print(name.h3.a.text, " - ", type.span.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...