Сложность соскребания следующей кнопки - PullRequest
1 голос
/ 14 апреля 2020

Вот сценарий, который я пытался написать, но не могу найти другой способ написать его, чтобы он работал.

Кажется, это единственная проблема с моим скриптом.

Любая помощь или советы по различным методам разбиения на страницы или шпаргалки "шпаргалки" будут приветствоваться.

import requests
from bs4 import BeautifulSoup
from csv import writer
from time import sleep

all_names = []

base_url = "https://palmettostatearmory.com"
url = "/sights-optics-scopes.html?p=1"


with open("PSA_sights_optics_scopes.csv", "w") as csv_file:   
    csv_writer = writer(csv_file)
    csv_writer.writerow(["Title", "Price", "Item Url", "Image"])


    while url:

        res = requests.get(f"{base_url}{url}")
        print(f"Now Scraping {base_url}{url}...")

        soup = BeautifulSoup(res.text, "html.parser")
        names = soup.findAll("div", {"class": "media listing"})
        #the whole element that is selected

        #looping through all of the names with a for loop
        for name in names:
            title = name.find("h2", {"class": "product-name"}).text.strip()
            price = name.find("span", {"class": "price-value"}).text.strip()
            img = name.find("img").get("src")
            csv_writer.writerow([title, price, img])

        #scraping the next page button
        next_btn = soup.find(class_="next i-next").get("href")

        url = next_btn if next_btn else None
        #tells it to click the next page button and then if there is not one, it wont run anymore, making the text above false and stops it
        sleep(4)

Вот ошибка, которую я получаю в терминале:

line 34, in <module>
next_btn = soup.find(class_="next i-next").get("href")
AttributeError: 'NoneType' object has no attribute 'get'

Вот что я вижу на сайте:

<li>
<a class="next i-next" href="[https://palmettostatearmory.com/sights-optics-scopes.html?p=2](https://palmettostatearmory.com/sights-optics-scopes.html?p=2)" title="Next">

Ответы [ 4 ]

1 голос
/ 14 апреля 2020

Попробуйте:

next_btn = soup.find("a", class_="next i-next").get("href") or 
next_btn = soup.find("a", {"class": "next i-next"}).get("href")
0 голосов
/ 16 апреля 2020

Вы уверены, что получаете контент страницы? Насколько я вижу, res = запросы.get ('https://palmettostatearmory.com/sights-optics-scopes.html?p=1') получает страницу с капчей. Сначала проверьте, что вы получите в ответ

0 голосов
/ 14 апреля 2020

Как насчет следующего

from bs4 import BeautifulSoup

html = '<a class="next i-next" href="[https://palmettostatearmory.com/sights-optics-scopes.html?p=2](https://palmettostatearmory.com/sights-optics-scopes.html?p=2)" title="Next">'

soup = BeautifulSoup(html, features="html.parser")

for link in soup.find_all('a'):
    print(link.get('href'))
0 голосов
/ 14 апреля 2020

Вы можете попробовать следующее, чтобы очистить URL-адрес следующей страницы:

import re
from bs4 import BeautifulSoup

html = """
<li>
<a class="next i-next" href="[https://palmettostatearmory.com/sights-optics-scopes.html?p=2](https://palmettostatearmory.com/sights-optics-scopes.html?p=2)" title="Next">
</li>
"""

soup = BeautifulSoup(html,"lxml")
next_page = soup.select_one("a[title='Next']")['href']
next_page = re.search(r"\[(.*?)\]",next_page).group(1)
print(next_page)

Без использования re:

next_page = soup.select_one("a[title='Next']")['href'].split("[")[1].split("]")[0]

Придерживание .find():

next_page = soup.find("a",{"title":"Next"})['href'].split("[")[1].split("]")[0]

Выход:

https://palmettostatearmory.com/sights-optics-scopes.html?p=2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...