Скрипт, пропускающий существующий элемент - BeautifulSoup - PullRequest
0 голосов
/ 04 июня 2018

У меня есть скрипт, который перебирает несколько страниц.Это работает по большей части, но я получаю сообщение об ошибке TypeError: 'NoneType' object is not subscriptable для ссылки, хотя элемент существует.Я добавил оператор if, else, который позволяет запускать сценарий, но оставляет пустое поле для ссылки на одну или две записи, которые должны быть там.Вот мой рабочий скрипт с оператором if, else.Любые предложения о том, как заставить это работать без заявления if, else?

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

base_url = "https://www.doabooks.org/"

books = []
n = 5
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, "html.parser")

    #grabs info for each textbook
    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
       if container.find('a', {'itemprop' : 'url'}):
          item['link'] = "https://www.doabooks.org" + container.find('a', {'itemprop' : 'url'})['href']
       else:
          item['link'] = ''
       item['source'] = "Directory of Open Access Books"
       if container.find("a",{"itemprop":"about"}):
          item['subject'] = container.find("a",{"itemprop":"about"}).text
       else:
          item['subject'] = ''
       item['base_url'] = "https://www.doabooks.org/"
       books.append(item) # add the item to the list

   with open("./json/doab-test.json", "w") as writeJSON:
       json.dump(books, writeJSON, ensure_ascii=False)

1 Ответ

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

Я думаю, что это может быть проблема с парсером (я не уверен). Как бы то ни было, я смог получить данные из URL на

import requests
from bs4 import BeautifulSoup as soup
x=requests.get("https://www.doabooks.org/doab?func=browse&page=2&queryField=A&uiLanguage=en")
print(soup(x.content).find_all("div",{"class":"data"})[5].find_all("a",{"itemprop":"url"}))

РЕДАКТИРОВАТЬ

Я заметил удаление "HTML.parser "как аргумент работал отлично для вашего script.ie просто не передавайте второй аргумент при объявлении супа страницы

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