У меня есть скрипт, который перебирает несколько страниц, и он работает нормально, пока не дойдет до страницы 19. Я получаю сообщение об ошибке:
if container.find(text="License: ").nextSibling.img:
AttributeError: 'NoneType' object has no attribute 'nextSibling'
Этот элемент существует на странице 19. Я также включилеще одно заявление, когда это не так.Я попытался requests
вместо urlopen
, чтобы увидеть, если это имеет значение, и даже изменил парсер с html.parser
на html5lib
на lxml
без удачи.Я думаю, что это может быть проблема с парсером, но я не уверен, какое решение может быть.Вот мой сценарий:
from urllib.request import urlopen
from bs4 import BeautifulSoup as soup
import json
base_url = "https://www.doabooks.org/"
data = []
n = 85
for i in range(1, n+1):
if (i == 1):
# handle first page
response = urlopen(base_url)
response = urlopen(base_url + "doab?func=browse&page=" + str(i) + "&queryField=A&uiLanguage=en")
page_html = response.read()
response.close()
#html parsing
page_soup = soup(page_html, "html5lib")
#grabs info for each book
containers = page_soup.findAll("div",{"class":"data"})
for container in containers:
item = {}
item['type'] = "Open Access Book"
item['title'] = container.span.text.strip()
item['author'] =container.a.text
item['link'] = "https://www.doabooks.org" + container.find('a', {'itemprop' : 'url'})['href']
item['source'] = "Directory of Open Access Books"
if container.div.find('a', {'itemprop' : 'about'}):
item['subject'] = container.div.find('a', {'itemprop' : 'about'}).text.lstrip()
else:
item['subject'] = ''
item['base_url'] = "https://www.doabooks.org/"
if container.find(text="License: ").nextSibling.img:
item['license'] = container.find(text="License: ").nextSibling['href']
else:
item['license'] = container.find(text="License: ").nextSibling.text
item['license_url'] = container.find(text="License: ").nextSibling['href']
data.append(item) # add the item to the list
with open("./json/doab-a.json", "w") as writeJSON:
json.dump(data, writeJSON, ensure_ascii=False)