Ниже мой код

import pandas as pd
import requests
from bs4 import BeautifulSoup

source = requests.get('https://www.vanglaini.org/').text
soup = BeautifulSoup(source, 'lxml')
for article in soup.find_all('article'):
    headline = article.a.text
    summary=article.p.text
    link = "https://www.vanglaini.org" +article.a['href']
    #print(headline)
    #print(summary)
    #print(link)

#print()

news_csv = pd.DataFrame({'Headline': headline,
                         'Summary': summary,
                        'Link' : link,


                         })
print(news_csv)

Я получил эту ошибку headline = article.a.text AttributeError: у объекта 'NoneType' нет атрибута 'текст'

Помогите!

0
drrrr 12 Окт 2019 в 16:00

1 ответ

Лучший ответ

Как вы уже получили в моих комментариях и в ответе @AmiTavory (удалено) - не во всех статьях есть ссылки, а иногда article.a дает None, поэтому у вас есть None.text, который выдает ошибку.

Вы должны проверить, что article.a не похож на None

import requests
from bs4 import BeautifulSoup

source = requests.get('https://www.vanglaini.org/').text
soup = BeautifulSoup(source, 'lxml')

for article in soup.find_all('article'):
    if article.a is None:
        continue        

    headline = article.a.text
    summary = article.p.text
    link = "https://www.vanglaini.org" + article.a['href']
    print(headline)
    print(summary)
    print(link)

И это работает.


РЕДАКТИРОВАТЬ . Вы можете получить ошибку

raise ValueError("If using all scalar values, you must pass an index") ValueError: If using all scalar values, you must pass an index

По совершенно другой причине, и вы должны создать новый вопрос на новой странице.

Это проблема в DataFrame, потому что у вас есть только последнее значение в headline, summary, link, но DataFrame ожидает списки в

{
    'Headline': list_with_headlines,
    'Summary': list_with_summaries,
    'Link' : list_with_links,
}

Вы должны создать пустые списки перед циклом for

list_with_headlines = []
list_with_summaries = []
list_with_links = []

И внутри for - цикл, вы должны append() значения в списки

list_with_headlines.append(headline)
list_with_summaries.append(summary)
list_with_links.append(link)

И позже создайте DataFrame используя списки

news_csv = pd.DataFrame({
    'Headline': list_with_headlines,
    'Summary': list_with_summaries,
    'Link' : list_with_links,
})

Полный код:

import pandas as pd
import requests
from bs4 import BeautifulSoup

source = requests.get('https://www.vanglaini.org/').text
soup = BeautifulSoup(source, 'lxml')

list_with_headlines = []
list_with_summaries = []
list_with_links = []

for article in soup.find_all('article'):
    if article.a is None:
        continue        
    headline = article.a.text.strip()
    summary = article.p.text.strip()
    link = "https://www.vanglaini.org" + article.a['href']
    list_with_headlines.append(headline)
    list_with_summaries.append(summary)
    list_with_links.append(link)

news_csv = pd.DataFrame({
    'Headline': list_with_headlines,
    'Summary': list_with_summaries,
    'Link' : list_with_links,
})

print(news_csv)
1
furas 12 Окт 2019 в 13:48