BeautifulSoup4: как заставить find_all () возвращать «N / A», когда элемент отсутствует на странице (python 3.6) - PullRequest
0 голосов
/ 31 августа 2018

Я использую find_all() для просмотра множества веб-страниц и извлечения текстов из целевых элементов HTML. Однако, когда целевой class отсутствует, find_all() просто пропускает его, никоим образом не указывая на отсутствие, что разрушает мои данные. Например, когда я ожидаю 100 записей, find_all() вернет 95; но мне нужно, чтобы пропущенные 5 были помечены как что-то вроде 'N / A', а не просто полностью исключены из вывода. Что я должен делать? Я попробовал следующий код, и он не сработал, возможно потому, что пустые записи никогда не помещались в author_list, так как целевой адрес div или class отсутствовал на некоторых страницах. Как я могу получить явное указание на отсутствие?

author_list = [] 
author_list = soup.find_all('div', {'class':'field field--name-field-citation-pages field--type-string field--label-hidden field__item'})
for author in author_list:
    if author in author_list:
        print(author.text)
    else: 
        print('N/A') 

Вывод, который я хочу, выглядит примерно так: ['x', 'x', 'x', 'x', 'x', 'x', 'N / A', 'x', 'x', ' N / A ']; но я хочу получить это ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x']

Полный код:

import requests as r
from bs4 import BeautifulSoup as soup
import pandas 

#make a list of all web pages' urls
webpages=[]
for i in range(15):
    root_url = 'https://cross-currents.berkeley.edu/archives?author=&title=&type=All&issue=All&region=All&page='+ str(i)
    webpages.append(root_url)
#start looping through all pages
titles = []
journals = []
authors = []
pages = []
dates = []
issues = []

for item in webpages:
    headers = {'User-Agent': 'Mozilla/5.0'}
    data = r.get(item, headers=headers)
    page_soup = soup(data.text, 'html.parser')

    #find targeted info and put them into a list to be exported to a csv file via pandas
    title_list = [title.text for title in page_soup.find_all('div', {'class':'field field-name-node-title'})]
    titles += [el.replace('\n', '') for el in title_list]

    journal_list = [journal.text for journal in page_soup.find_all('em')]
    journals += [el.replace('\n', '') for el in journal_list] 

    author_list = [author.text for author in page_soup.find_all('div', {'class':'field field--name-field-citation-authors field--type-string field--label-hidden field__item'})]
    authors += [el.replace('\n', '') for el in author_list]

    pages_list = [pages.text for pages in page_soup.find_all('div', {'class':'field field--name-field-citation-pages field--type-string field--label-hidden field__item'})]
    pages += [el.replace('\n', '') for el in pages_list]

    date_list = [date.text for date in page_soup.find_all('div', {'class':'field field--name-field-date field--type-datetime field--label-hidden field__item'})]
    dates += [el.replace('\n', '') for el in date_list]

    issue_list = [issue.text for issue in page_soup.find_all('div', {'class':'field field--name-field-issue-number field--type-integer field--label-hidden field__item'})]
    issues += [el.replace('\n', '') for el in issue_list]

dataset = {'Title': titles, 'Author': authors, 'Journal': journals, 'Date': dates, 'Issue': issues, 'Pages': pages}

1 Ответ

0 голосов
/ 31 августа 2018

После получения всех 100 записей в списке вы выполняете цикл, который в основном циклически повторяет все те же 100 записей, которые также включают значение «Нет». Вот почему автор всегда присутствует в author_list, несмотря на то, что он принимает значение null или реальный результат.

Что вы можете сделать, так это проверить в цикле любое «Нет» или нулевое значение и печатать, неприменимо для этого каждый раз.

Также используйте взамен findAll ("div", {"class": "....."}). Возвращает нулевое значение.

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