Нет данных в массиве JSON - BeautifulSoup и Python 3 - PullRequest
0 голосов
/ 07 мая 2018

Сценарий, который я имею ниже, продолжает возвращать пустой массив, когда я пытаюсь записать содержимое в файл JSON. Нет ошибок, которые появляются при запуске скрипта. Он также ничего не печатает в терминале. У меня есть несколько похожих скриптов для других сайтов, которые работают отлично. Вот мой код. Заранее спасибо.

from urllib.request import urlopen
from bs4 import BeautifulSoup as soup
import json

openstax = 'https://cnx.org'

#opening up connection and grabbing page
uClient = urlopen(openstax)
page_html = uClient.read()
uClient.close()

#html parsing
page_soup = soup(page_html, "html.parser")

#grabs info for each textbook
containers = page_soup.findAll("div",{"class":"book"})

data = []
for container in containers:
   item = {}
   item['type'] = "Textbook"
   item['title'] = container.h3.a.text
   data.append(item)
   print(item['title']) 

with open("./json/openstax.json", "w") as writeJSON:
    json.dump(data, writeJSON, ensure_ascii=False)

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Содержимое этой страницы генерируется динамически, поэтому вы не можете захватить их так, как вы попробовали выше. Вам нужно использовать любой браузерный симулятор или попробовать этот URL , чтобы получить результат. Последний намного эффективнее и с ним легче иметь дело. Попробуй.

import requests

r = requests.get('https://archive.cnx.org/extras')
for item in r.json()['featuredLinks']:
    print(item['title'])

Результат:

Applied Probability
Understanding Basic Music Theory
Programming Fundamentals - A Modular Structured Approach using C++
Advanced Algebra II: Conceptual Explanations
Flowering Light: Kabbalistic Mysticism and the Art of Elliot R. Wolfson
Hearing Harmony: What is Harmony?
0 голосов
/ 07 мая 2018

Загружаемая страница (определенная в переменной openstax) создается на стороне клиента с помощью javascript. Таким образом, окончательный HTML-код отсутствует в ответе на запрос, который вы делаете с помощью своего кода.

Из-за этого при поиске page_soup.findAll("div",{"class":"book"}) он не возвращает никаких элементов, что, в свою очередь, объясняет, что файл json является пустым массивом.

Как указано в возвращенной html этой странице, в элементе noscript вы должны попытаться использовать URL http://legacy.cnx.org/content, если не хотите использовать отображаемую веб-страницу javascript.

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