Python Double для вопроса об атрибутах цикла - PullRequest
0 голосов
/ 12 декабря 2018

Итак, у меня есть две следующие находки BeautifulSoup и веб-страница, на которой я работаю:

r = requests.get("https://www.viperprint.pl/produkt/arkusze-plano/AP01")
soup = BeautifulSoup(r.content)
elems = soup.find_all('a', {'class': 'tabela_cenowa eprint_product_link add_to_cart_link'})
hehes = soup.find_all('a', {'id': 'dLabel'})

Из этого мне нужно получить двойной цикл for, который печатает списки в отдельные столбцы в файле .csv

Вот моя проблема:

>>> for elem, hehe in zip(elems, hehes):
...     nazwa = hehe.get('title')
...     qty = elem.attrs.get('data-qty')
...     print(nazwa, qty)

Дает мне вывод ниже.Это неправильно, потому что каждый элемент, который находится в столбце 1 (т. Е. «Arkusze PLANO» и все ниже), должен быть рядом друг с другом, и только первая цифра в столбце 2 («100») также должна быть в одной строке,

Неверный вывод:

('Arkusze PLANO', '100')

('A1+ (880 x 630 mm)', '250')

('Dwustronnie kolorowe (4+4 CMYK)', '500')

(u'Kreda b\u0142ysk 130g', '1000')

('Bez uszlachetniania (0+0)', '1500')

(None, '2000')

Ожидаемый вывод:

'Arkusze PLANO';'A1+ 880 x 630 mm';'Dwustronnie kolorowe 4+4 CMYK';u'Kreda b\u0142ysk 130g';'Bez uszlachetniania 0+0';'100'

Я пытался использовать функцию .attrs следующим образом:

for elem, hehe in zip(elems, hehes):
    nazwa = hehe[0].get('title')
    format = hehe[1].get('title')
    qty = elem.attrs.get('data-qty')
    print(nazwa, format, qty)

... но я получил следующие ошибки и не знаю, как поступить дальше:

Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/usr/lib/python2.7/site-packages/bs4/element.py", line 905, in __getitem__
return self.attrs[key]
KeyError: 0

Извините за столь длинный пост, но я хотел предоставить как можно больше подробностей.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Я добавил еще один цикл для получения полностью желаемого результата.

for elem in elems:
    qty = elem.attrs.get('data-qty')
    print(results, qty, pricenum)

Спасибо всем за помощь!

0 голосов
/ 12 декабря 2018

Это даст вам желаемый вывод, который вы ищете в списке:

import requests
import bs4


r = requests.get("https://www.viperprint.pl/produkt/arkusze-plano/AP01")
soup = bs4.BeautifulSoup(r.content, 'html.parser')
elems = soup.find_all('a', {'class': 'tabela_cenowa eprint_product_link add_to_cart_link'})
hehes = soup.find_all('a', {'id': 'dLabel'})

results = []

nazwa_list = []
qty_value = None

for elem, hehe in zip(elems, hehes):
    nazwa = hehe.get('title')

    if qty_value == None:
        qty_value = elem.attrs.get('data-qty')

    if nazwa != None:
        nazwa_list.append(nazwa)

nazwa_list.append(qty_value)
results = nazwa_list

вывод:

In  [1]: print (results)
Out [1]: ['Arkusze PLANO', 'A1+ (880 x 630 mm)', 'Dwustronnie kolorowe (4+4 CMYK)', 'Kreda błysk 130g', 'Bez uszlachetniania (0+0)', '100']

Но вы заявляете, что хотите поместить в CSV.Таким образом, вы можете положить его в таблицу, а затем работать с ним таким же образом, если вы хотите

import requests
import bs4
import pandas as pd

r = requests.get("https://www.viperprint.pl/produkt/arkusze-plano/AP01")
soup = bs4.BeautifulSoup(r.content, 'html.parser')
elems = soup.find_all('a', {'class': 'tabela_cenowa eprint_product_link add_to_cart_link'})
hehes = soup.find_all('a', {'id': 'dLabel'})


results = pd.DataFrame()

for elem, hehe in zip(elems, hehes):
    nazwa = hehe.get('title')
    qty = elem.attrs.get('data-qty')
    temp_df = pd.DataFrame([[nazwa, qty]], columns = ['title', 'qty'])

    results = results.append(temp_df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...