TypeError: объект 'int' не может быть повторен во время Webscraping с BeatifulSoup - PullRequest
0 голосов
/ 19 января 2020

Я сейчас пытаюсь разобрать все факты о https://www.snapple.com/real-facts, и так как я не нашел ничего полезного в Интернете, я решил написать свой собственный сценарий

from bs4 import BeautifulSoup as soup
import requests

data = requests.get('https://www.snapple.com/real-facts')

result_list = []
soup = soup(data.text, 'html.parser')
divs = soup.find("div", {'id':'facts'})
for div in divs:
    fact_li = div.find('li')
    for fact in fact_li:
        spans = fact.find('span', {'class':'description'})
        for span in spans:
            a = fact.find('a')
            result_list.append(a)

print(result_list)

, когда я запустите this, он возвращает:

 Traceback (most recent call last):
  File "snapplefactscrape.py", line 11, in <module>
    for fact in fact_li:
TypeError: 'int' object is not iterable

Я понимаю, что это значит, но я не понимаю, почему fact_li является целым числом, и как я могу помешать ему стать единым целым.

Помощь будет оценил:)

Ответы [ 2 ]

1 голос
/ 19 января 2020

При итерации for div in divs: div становится строкой. Поэтому вместо метода поиска bs4 для тегов вы используете метод поиска для строк, который возвращает -1, если подстрока не найдена.

В первой итерации, например, значение div равно " \ п». Это было бы хорошим примером использования отладчика для проверки значения переменных. Или даже используйте print для проверки значений и типов.

1 голос
/ 19 января 2020

Чтобы получить все элементы, используйте find_all вместо find.

. Вам не нужно использовать 3 цикла для получения всех ссылок, используя select с селектором #facts .description a css. дать вам их:

base_url = 'https://www.snapple.com'
data = requests.get(f'{base_url}/real-facts')
soup = soup(data.text, 'html.parser')

links = soup.select('#facts .description a')
for link in links:
    print(link.text, base_url + link['href'])

Но если вы хотите использовать циклы:

divs = soup.find_all('div', {'id': 'facts'})
for div in divs:
    fact_li = div.find_all('li')
    for fact in fact_li:
        spans = fact.find_all('span', {'class': 'description'})
        for span in spans:
            a = fact.find_all('a')
            result_list.append(a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...