Web Scraping в Python с BeautifulSoup - PullRequest
1 голос
/ 22 марта 2020

Я новичок в очистке и застрял на очистке веб-страницы, содержащей некоторые цитаты, которые я хочу извлечь.

Не могли бы вы также проверить код для копирования очищенных данных в файл CSV?

here

import requests
from bs4 import BeautifulSoup
import csv

URL = "http://www.values.com/inspirational-quotes"
r = requests.get(URL)

soup = BeautifulSoup(r.content, 'html5lib')

quotes=[] # a list to store quotes

table = soup.find('div', attrs = {'id':'container'})

for row in table.findAll('div', attrs = {'class':'quote'}):
    quote = {}
    quote['theme'] = row.h5.text
    quote['url'] = row.a['href']
    quote['img'] = row.img['src']
    quote['lines'] = row.h6.text
    quote['author'] = row.p.text
    quotes.append(quote)

filename = 'inspirational_quotes.csv'
with open(filename, 'wb') as f:
    w = csv.DictWriter(f,['theme','url','img','lines','author'])
    w.writeheader()
    for quote in quotes:
        w.writerow(quote)

Я получаю сообщение об ошибке в функции "findAll".

for row in table.findAll('div', attrs = {'class':'quote'}):    
AttributeError: 'NoneType' object has no attribute 'findAll

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

html этого сайта отличаются от тех, которые вы определили в своем скрипте. Я исправил первые три поля. Я полагаю, вы можете сделать все остальное. Следующее должно работать для вас.

import csv
import requests
from bs4 import BeautifulSoup

URL = "https://www.passiton.com/inspirational-quotes?page={}"

quotes = []
page = 1

while True:
    r = requests.get(URL.format(page))
    print(r.url)
    soup = BeautifulSoup(r.content, 'html5lib')

    if not soup.select_one("#all_quotes .text-center > a"):break
    for row in soup.select("#all_quotes .text-center"):
        quote = {}
        try:
            quote['quote'] = row.select_one('a img.shadow').get("alt")
        except AttributeError: quote['quote'] = ""
        try:
            quote['url'] = row.select_one('a').get('href')
        except AttributeError: quote['url'] = ""
        try:
            quote['img'] = row.select_one('a img.shadow').get('src')
        except AttributeError: quote['img'] = ""
        quotes.append(quote)

    page+=1

with open('inspirational_quotes.csv', 'w', newline="", encoding="utf-8") as f:
    w = csv.DictWriter(f,['quote','url','img'])
    w.writeheader()
    for quote in quotes:
        w.writerow(quote)
0 голосов
/ 22 марта 2020

На сайте нет тегов div с атрибутом id: container. Вы можете использовать Quote API

from requests import get
url='https://quote-garden.herokuapp.com/quotes/random'
res=get(url)
res=res.json()
quote=res["quoteText"]
quoteauthor=res["quoteAuthor"]


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