#python #beautifulsoup
#питон #прекрасный суп
Вопрос:
Я изучаю веб-скребок и столкнулся с проблемой. Я пытаюсь использовать метод .find (), встроенный в BS4, но он видит код как питоны, встроенные в .find()
Я не знаю, как это исправить. Я пробовал использовать .soup.find (), но, похоже, это тоже не помогло.
Вот мой код, я получаю ошибку в строках 9 и 10
from bs4 import BeautifulSoup import requests html_text = requests.get('https://www.diyelectronics.co.za/store/353-printers') soup = BeautifulSoup(html_text.text, 'lxml') printers = soup.find('ul', class_='product_list grid row') for printer in printers: printer_price = printer.find('span', class_='price product-price') printer_name = printer.find('h5', class_='product-name-container') print(f''' Printer Name: {printer_name} Printer Price: {printer_price} ''')
Комментарии:
1.
printers = soup.find('ul', class_='product_list grid row')
—gt;printers = soup.find_all('ul', class_='product_list grid row')
Ответ №1:
Если существует несколько lt;ulgt;
элементов с классом of product_list grid row
, вы должны использовать .find_all()
вместо .find()
:
printers = soup.find_all('ul', class_='product_list grid row')
Комментарии:
1. Это все исправило, но я не совсем понимаю, почему. Я понимаю, почему вы используете find_all (), поскольку существует более 1 элемента lt;ulgt;. Но почему это меняет код, который виден из Pythons .find (), на BeutifulSoups .find() Я все еще новичок, но я просто хочу учиться и избегать ошибок?
2. потому что, если вы используете,
.find()
он вернет первое вхождение, похожее на строку, а затем вы пройдете по этой строке и вызовете.find()
каждый символ в этой строке, и это вызовет ошибку. @JonathanLangford3. О, теперь я понимаю, большое вам спасибо! Я действительно ценю это.