Невозможно вернуть все результаты сразу - PullRequest
0 голосов
/ 20 января 2019

Я написал скрипт на python для получения некоторых ссылок с веб-страницы. В моем сценарии есть две функции. Первая функция собирает ссылки на местные компании с веб-страницы, а вторая функция просматривает эти ссылки и собирает ссылки на различные события.

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

Как вернуть все результаты, соответствующие приведенному ниже дизайну?

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

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

linklist = []

def collect_links(link):
    res = requests.get(link)
    soup = BeautifulSoup(res.text, "lxml")
    items = [urljoin(url,item.get("href")) for item in soup.select(".business-listings-category-list .field-content a[hreflang]")]
    return items

def fetch_info(ilink):
    res = requests.get(ilink)
    soup = BeautifulSoup(res.text, "lxml")
    for item in soup.select(".business-teaser-title a[title]"):
        linklist.append(urljoin(url,item.get("href")))
    return linklist

if __name__ == '__main__':
    url = "https://www.parentmap.com/atlas"
    for itemlink in collect_links(url):
        print(fetch_info(itemlink))

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Основная причина, по которой вы получаете результаты один за другим, заключается в том, что вы вызываете fetchinfo в цикле, который вызывает функцию снова и снова, что приводит к печати данных один за другим, а не к использованию цикла в функции fetchinfo. Попробуйте следующий код

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

linklist = []

def collect_links(link):
    res = requests.get(link)
    soup = BeautifulSoup(res.text, "lxml")
    items = [urljoin(url,item.get("href")) for item in soup.select(".business-listings-category-list .field-content a[hreflang]")]
    return items

def fetch_info(url):
    for itemlink in collect_links(url):
       res = requests.get(ilink)
       soup = BeautifulSoup(res.text, "lxml")
        for item in soup.select(".business-teaser-title a[title]"):
            linklist.append(urljoin(url,item.get("href")))
    return linklist

if __name__ == '__main__':
    url = "https://www.parentmap.com/atlas"
    for itemlink in collect_links(url):
        print(fetch_info(itemlink))
0 голосов
/ 20 января 2019

Прежде всего, я удалил глобальный linklist, так как он все равно возвращается из функции, и сохранение глобального создает перекрывающиеся результаты.Затем я добавил функцию для «сборки» ссылок так, как вы хотели.Я использовал набор для предотвращения дублирования ссылок.

#!/usr/bin/python

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

def collect_links(link):
    res = requests.get(link)
    soup = BeautifulSoup(res.text, "lxml")
    items = [urljoin(url,item.get("href")) for item in soup.select(".business-listings-category-list .field-content a[hreflang]")]
    return items

def fetch_info(ilink):
    linklist = []
    res = requests.get(ilink)
    soup = BeautifulSoup(res.text, "lxml")
    for item in soup.select(".business-teaser-title a[title]"):
        linklist.append(urljoin(url,item.get("href")))
    return linklist

def fetch_all_links(url):
    links = set()
    for itemlink in collect_links(url):
        links.update(fetch_info(itemlink))
    return list(links)

if __name__ == '__main__':
    url = "https://www.parentmap.com/atlas"
    print(fetch_all_links(url))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...