Возникают проблемы со ссылками, имеющими различную нумерацию страниц - PullRequest
0 голосов
/ 24 декабря 2018

Я написал скрипт на python, чтобы очистить заголовки различных предметов, расположенных в правой части области рядом с картой его целевой страницы.Есть две ссылки, которые я использовал в своем скрипте: одна имеет пагинацию, а другая - нет.

Когда я выполняю свой скрипт, он сначала проверяет ссылки на пагинацию.Если он находит его, он передает ссылки в функцию get_paginated_info() для вывода результата.Однако, если ему не удается найти ссылки на страницы, он передает объект-суппорт в функцию get_info() и печатает результат там.На данный момент скрипт работает именно так, как я описал.

Как заставить мой скрипт печатать результат в функции get_info(), только если ссылка имеет нумерацию страниц или не соответствуетлогику, которую я уже пытался применить, так как я хочу исключить функцию get_paginated_info() из моего скрипта?

Это моя попытка:

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

urls = (
    'https://www.mobilehome.net/mobile-home-park-directory/maine/all',
    'https://www.mobilehome.net/mobile-home-park-directory/rhode-island/all',
)

def get_names(link):
    r = requests.get(link)
    soup = BeautifulSoup(r.text,"lxml")
    items = soup.select_one(".pagination a.next_page")
    if items:
        npagelink = items.find_previous_sibling().get("href").split("/")[-1]
        return [get_paginated_info(link + "/page/{}".format(page)) for page  in range(1,int(npagelink)+1)]

    else:
        return [get_info(soup)]

def get_info(soup):
    print("================links without pagination==============")
    for items in soup.select("td[class='table-row-price']"):
        item = items.select_one("h2 a").text
        print(item)

def get_paginated_info(url):
    r = requests.get(url)
    sauce = BeautifulSoup(r.text,"lxml")
    print("================links with pagination==============")
    for content in sauce.select("td[class='table-row-price']"):
        title = content.select_one("h2 a").text
        print(title)

if __name__ == '__main__':
    for url in urls:
        get_names(url)

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

1 Ответ

0 голосов
/ 24 декабря 2018

Я немного изменил логику.Так что теперь и в тех случаях, когда есть пагинация, и когда нет сценария пагинации, назовем get_names.Но во втором случае в цикле for будет выполнена только одна итерация

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

urls = (
    'https://www.mobilehome.net/mobile-home-park-directory/maine/all',
    'https://www.mobilehome.net/mobile-home-park-directory/rhode-island/all',
)

def get_names(link):
    r = requests.get(link)
    soup = BeautifulSoup(r.text,"lxml")
    items = soup.select_one(".pagination a.next_page")
    try:
        npagelink = items.find_previous_sibling().get("href").split("/")[-1]
    except AttributeError:
        npagelink = 1
    return [get_info(link + "/page/{}".format(page)) for page in range(1, int(npagelink) + 1)]


def get_info(url):
    r = requests.get(url)
    sauce = BeautifulSoup(r.text,"lxml")
    for content in sauce.select("td[class='table-row-price']"):
        title = content.select_one("h2 a").text
        print(title)

if __name__ == '__main__':
    for url in urls:
        get_names(url)

Пожалуйста, перепроверьте вывод, чтобы убедиться, что все работает как положено

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