Метод BS "find_all" не соответствует цели - PullRequest
0 голосов
/ 03 апреля 2019

Когда я использую метод find_all на этой странице красивый суп не находит все цели.

Этот код:

len(mySoup.find_all('div', {'class': 'lo-liste row'}))

Возвращает 1, но покаих 4.

Это URL-адрес супа.

Ответы [ 4 ]

0 голосов
/ 03 апреля 2019

Используйте регулярное выражение re, чтобы найти элемент.

from bs4 import BeautifulSoup
import requests
import re

url = 'https://www.ubaldi.com/offres/jeu-de-3-disques-feutres-electrolux--ma-92ca565jeud-4b9yz--727536.php'

html= requests.get(url)
soup = BeautifulSoup(html.text, 'html.parser')
print(len(soup.find_all('div', class_=re.compile('lo-liste row'))))

Выход:

4
0 голосов
/ 03 апреля 2019

find_all правильно соответствует всем целям.

Первый продукт имеет class=lo-liste row

Следующие 3 продукта имеют class=lo-liste row not-first-ligne

import requests

url = 'https://www.ubaldi.com/offres/jeu-de-3-disques-feutres-electrolux--ma-92ca565jeud-4b9yz--727536.php'

response = requests.get(url)
mySoup = BeautifulSoup(response.text, 'html.parser')


for product in mySoup.find_all('div', {'class': 'lo-liste row'}):
    print (product.find('a').find_next('span').text.strip())


for product in mySoup.find_all('div', {'class': 'lo-liste row not-first-ligne'}):
    print (product.find('a').find_next('span').text.strip())


# or to combine those 2 for loops into 1
#for product in mySoup.findAll('div', {'class': ['lo-liste row','not-first-ligne']}):
    #print (product.find('a').find_next('span').text.strip())

Выход:

SOS Accessoire
Stortle
Groupe-Dragon
Asdiscount
0 голосов
/ 03 апреля 2019

Используйте вместо этого выбор.Это будет соответствовать всем 4 для этого класса.

items = soup.select('.lo-liste.row')
0 голосов
/ 03 апреля 2019

Когда я посмотрел в исходном коде данной ссылки, я обнаружил, что есть только 1 div с именем класса "lo-liste row", остальные три div имеют имя класса следующим образом "lo-liste row not-first-ligne", так что этопочему вы получили только 1 в качестве вывода.попробуйте следующий код

len(soup.findAll('div', {'class': ['lo-liste row','not-first-ligne']}))

введите код

from bs4 import BeautifulSoup
import requests
page = requests.get("https://www.ubaldi.com/offres/jeu-de-3-disques-feutres-electrolux--ma-92ca565jeud-4b9yz--727536.php")
soup = BeautifulSoup(page.content, 'html.parser')
print(len(soup.findAll('div', {'class': ['lo-liste row','not-first-ligne']})))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...