Сообщение: Элемент не удалось прокрутить в поле зрения

#python #selenium #web-scraping #beautifulsoup

#python #селен #веб-очистка #beautifulsoup

Вопрос:

Я пытаюсь найти обзоры книг по указанному URL. Мне нужно название книги и каждая рецензия в отдельных строках. Ниже приведен мой код. Я использую как selenium, так и bs4. Буду признателен за любые отзывы и приношу искренние извинения, если я не придерживаюсь правил публикации, поскольку я относительно новичок на этом портале!

 from selenium.webdriver import Firefox
browser = Firefox()
url ="https://www.booksaremagic.net/?q=h.tvieweramp;using_sb=status"
browser.get(url)
detailed_list = browser.find_element_by_xpath("//div[@title='Detailed']")
detailed_list.click()

books1 = []
for i in range(1,201):
    page_source1 = browser.page_source
    soup1 = BeautifulSoup(page_source1, "html.parser")
    for book1 in soup1.find_all('td',{"nbr ca"}):
        browser.find_element_by_tag_name('a[class="lightgrey bordered button moreinfo togsrus"]').click()
        browser.find_element_by_xpath("//*[@id='tabber_obj_0_div_3']").click()
        reviews = browser.find_element_by_id('tabber_obj_0_divbody_3').text
        all_books_scraped1 = [reviews]
        books1.append(all_books_scraped1)
        print("Finished Extracting Page:",i)
    try:
        select = Select(browser.find_element_by_class_name('quicknav')) 
        select.select_by_value(str(i))
    except:
        print("nScraping Complete...")
  

Вывод должен быть df с:

(Cols)Обзор книг (строки) Обзор книги 1 Обзор книги 1 Обзор книги 2 Обзор книги 1 N . . . Обзор книги 9918 N

Ответ №1:

Я обнаружил, что на сайте есть какой-то API для получения данных, вот мой код:

 import requests as r
from bs4 import BeautifulSoup
import re

link = 'https://www.booksaremagic.net/?q=h.tvieweramp;using_sb=statusamp;filt[status]= activenotcb,__instockamp;infscroll=1amp;amp;t=3amp;lim=500amp;dm=7amp;using_sb=statusamp;overridelim=1amp;dm=7amp;offs=0'

# Get 500 books at once, if you're planning to get more, add 500 to the offs, so it goes like 0, 500, 1000, 1500, ...
# You can use up to 10000 at once, so 0, 10000, 20000, ...
res = r.get(link)
data = res.json()
books_5 = data["rs"]
# Each row in books_5 will contain html with 5 books in it
for row in books_5:
    for x in row.values():
        soup = BeautifulSoup(x, "html.parser")
        # Get the title
        title = soup.find_all('b')[0].text
        # get the link for the book
        link_book = soup.find_all('a')[0]["href"]
        # get the html page for the requested book
        res = r.get("https://www.booksaremagic.net/" link_book "amp;t=3")
        data = res.json()
        try:
            all_reviews_html = data["rs"][0]["sr"]["iv"]["rs"][0]["tabdata"][3]["tab_body"]
            soup_text = BeautifulSoup(all_reviews_html, "html.parser").text
            reviews = re.findall("“[^”] ”[^“] ", soup_text)
            # start and ends with " and the other is what follows after this —
            print(reviews)
        except:
            print(title, ": has no reviews.")
            pass
        # Here you have the title and all_reviews in html format for the book, extract your reviews with beautifulsoup
        # add your treatement here
  

Вам просто нужно извлечь отзывы из html-кода all_reviews_html , в нем есть только отзывы, а не полная страница. И у вас есть title . Просто добавьте после этого печать.

Комментарии:

1. Не могли бы вы рассказать мне, как вы получили all_reviews_html? После этого я сделал это: code books1 = [] # добавьте сюда свое лечение soup1 = BeautifulSoup(all_reviews_html, ‘html.parser’) reviews = soup1.text all_books_scraped1 = [заголовок, обзоры] books1.append(all_books_scraped1) code но там написано: all_reviews_html = данные[ «rs»][0][«sr»][«iv»][«rs»][0][«tabdata»][3][«tab_body»] ошибка, ошибка индекса: индекс списка вне диапазона

2. Это работает, когда я запускаю вне цикла, извиняюсь, если мне не хватает чего-то простого!

3. Эй, я, видимо, что-то пропустил в конце. Я отредактировал код, произошла ошибка, потому что есть книги, у которых нет отзывов, в моем коде я не учитывал это. Теперь это исправлено.

4. большое вам спасибо. Есть ли способ разделить обзоры для каждой книги? Прямо сейчас я получаю столбец отзывов со всеми отзывами, сгруппированными в одну строку. В любом случае я действительно ценю вашу помощь!!

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