Проблема парсера с BeautifulSoup - PullRequest
0 голосов
/ 08 июня 2018

У меня есть скрипт, который перебирает несколько страниц, и он работает нормально, пока не дойдет до страницы 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)

1 Ответ

0 голосов
/ 09 июня 2018

Книга с названием «После преобразования» на https://www.doabooks.org/doab?func=browse&page=19&queryField=A&uiLanguage=en не имеет «Лицензии», поэтому в вашем коде

container.find(text="License: ") 

нет, поэтому вы не можете получить

.nextSibling.img 

из объекта NoneType, поэтому он генерирует исключение.Попробуйте что-то вроде этого:

if not container.find(string="License: "):
    item['license_url'] = item['license'] = "Not Specified"
else:
    if container.find(string="License: ").nextSibling.img:
        item['license'] = container.find(string="License: ").nextSibling['href']
    else:
        item['license'] = container.find(string="License: ").nextSibling.text
    item['license_url'] = container.find(string="License: ").nextSibling['href']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...