Как очистить данные следующей страницы, как я делаю на первой странице? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть следующий код:

from bs4 import BeautifulSoup
import requests
import csv
url = "https://coingecko.com/en"
base_url = "https://coingecko.com"
page = requests.get(url)
soup = BeautifulSoup(page.content,"html.parser")
names = [div.a.span.text for div in soup.find_all("div",attrs={"class":"coin-content center"})]
Link = [base_url+div.a["href"] for div in soup.find_all("div",attrs={"class":"coin-content center"})]
for link in Link:
    inner_page = requests.get(link)
    inner_soup = BeautifulSoup(inner_page.content,"html.parser")
    indent = inner_soup.find("div",attrs={"class":"py-2"})
    content = indent.div.next_siblings
    Allcontent = [sibling for sibling in content if sibling.string is not None]
    print(Allcontent)

Я успешно вошел на внутреннюю страницу и получил все монеты информацию с первой страницы перечисленной монеты.Но есть следующая страница как 1,2,3,4,5,6,7,8,9 и т. Д. Как я могу перейти ко всем следующей странице и сделать то же самое, что и ранее?

Кроме того, вывод моего кода содержит много\n и пробел.Как я могу это исправить.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

То, как вы написали свой сценарий, выглядит грязно.Попробуйте с помощью .select () сделать его лаконичным и менее подверженным поломкам.Хотя я не смог найти дальнейшего использования names в вашем скрипте, я сохранил его как есть.Вот как вы можете получить все доступные ссылки, проходящие через несколько страниц.

from bs4 import BeautifulSoup
from urllib.parse import urljoin
import requests

url = "https://coingecko.com/en"

while True:
    page = requests.get(url)
    soup = BeautifulSoup(page.text,"lxml")
    names = [item.text for item in soup.select("span.d-lg-block")]
    for link in [urljoin(url,item["href"]) for item in soup.select(".coin-content a")]:
        inner_page = requests.get(link)
        inner_soup = BeautifulSoup(inner_page.text,"lxml")
        desc = [item.get_text(strip=True) for item in inner_soup.select(".py-2 p") if item.text]
        print(desc)

    try:
        url = urljoin(url,soup.select_one(".pagination a[rel='next']")['href'])
    except TypeError:break

Кстати, пробелы также были учтены с помощью .get_text(strip=True)

0 голосов
/ 12 октября 2018

Вам нужно сгенерировать все страницы и запросы по одной и проанализировать, используя bs4

from bs4 import BeautifulSoup
import requests

req = requests.get('https://www.coingecko.com/en')
soup = BeautifulSoup(req.content, 'html.parser')
last_page = soup.select('ul.pagination li:nth-of-type(8) > a:nth-of-type(1)')[0]['href']
lp = last_page.split('=')[-1]
count = 0
for i in range(int(lp)):
    count+=1
    url = 'https://www.coingecko.com/en?page='+str(count)
    print(url)
    requests.get(url)#requests each page one by one till last page
    ##parse your fileds here using bs4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...