почему поиск объекта не повторяется? - PullRequest
0 голосов
/ 24 мая 2019

Я хочу сканировать данные на сайте.Но что-то не так в моем коде

Я хочу выяснить, почему поиск объекта неправильный и поиск в переполнении стека, но я не могу найти, что не так в этом коде

from bs4 import BeautifulSoup
from pymongo import MongoClient
import requests
from matplotlib import font_manager, rc

client = MongoClient("localhost", 27017)
database = client.datadb
collection = database.datacol

page = requests.get("https://www.worlddata.info/average-income.php")

soup = BeautifulSoup(page.content, 'html.parser')

general_list = soup.find("tr")

#list_of_tr = general_list.find("tr")

for in_each_tr in general_list:
    list_of_td0 = general_list.find_all("td")[0]
    list_of_td1 = general_list.find_all("td")[1]
    general_list = collection.insert_one({"country":list_of_td0.get_text(), "income":list_of_td1.get_text()})


Traceback (most recent call last):
  File "C:/Users/SAMSUNG/PycharmProjects/simple/data.py", line 18, in <module>
    for in_each_tr in general_list:
TypeError: 'NoneType' object is not iterable

Ответы [ 3 ]

0 голосов
/ 24 мая 2019

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

Сначала установите веб-драйвер selenium согласно вашему браузеру.

импорт селена веб-драйвер

from selenium import webdriver

Скачать веб-контент

driver = webdriver.Chrome("/usr/bin/chromedriver")
driver.get('https://www.worlddata.info/average-income.php')

Где "/usr/bin/chromedriver" Путь веб-драйвера

Получить HTML-контент

soup = BeautifulSoup(driver.page_source, 'lxml')

Теперь вы получите tr tag объект

general_list = soup.find("tr")
0 голосов
/ 24 мая 2019

Похоже, что requests.get("https://www.worlddata.info/average-income.php") дает 403 в качестве ответа, что означает, что доступ к веб-странице запрещен.

Я немного погуглил и нашел этот пост StackOverflow . В нем говорится, что некоторые веб-страницы могут отклонять GET запросов, которые не идентифицируют User-Agent.

Если вы добавите заголовок к requests.get примерно так:

header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
page = requests.get("https://www.worlddata.info/average-income.php", headers=header)

Тогда ответ на запрос GET будет 200, и ваш код должен работать как положено.

0 голосов
/ 24 мая 2019

Ваше general_list значение none.

вам необходимо добавить проверку перед выполнением действий с объектом.

Я предполагаю, что этот адрес возвращает запрещенную ошибку, поэтому в ответе нет <tr>.

Если вы измените адрес на:

page = requests.get("https://www.google.com")

soup = BeautifulSoup(page.content, 'html.parser')

general_list = soup.find("tr")

for tr in general_list: 
    print(tr)

Работает.

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