Итерация по словарю в Python - PullRequest
0 голосов
/ 06 октября 2019

У меня есть несколько сайтов, с которых я хочу получать информацию с BeautifulSoup. Список сайтов будет меняться со временем. Кроме того, некоторые сайты могут не иметь соответствующей информации в то время.

Я заполняю адреса соответствующих сайтов и оставляю другие пустыми.

site1 = "http://www.some-site.com"
site2 = "http://www.another-site.com"
site3 = ""
site4 = "http://www.still-another-site.com"

Я могу вручную получить «суп»с каждого URL с этим. У меня есть except операторы для обработки пропущенных URL-адресов.

try:
    source_site1 = requests.get(site1, headers=hdr).text
    soup_site1 = BeautifulSoup(source_site1, "lxml")
try:
    source_site2 = requests.get(site2, headers=hdr).text
    soup_site2 = BeautifulSoup(source_site2, "lxml")
try:
    source_site3 = requests.get(site3, headers=hdr).text
    soup_site3 = BeautifulSoup(source_site3, "lxml")
try:
    source_site4 = requests.get(site4, headers=hdr).text
    soup_site4 = BeautifulSoup(source_site4, "lxml")

Есть ли способ сгруппировать URL-адреса и выполнить итерацию по всей группе, чтобы получить «суп» для каждого сайта без необходимости жесткого кодирования каждого из ниходин (как выше)?

Если нет, есть ли другой метод, который даст те же результаты (отдельная переменная "суп" для каждого сайта)?

Я пробовал это, но "для"петля тупит меня.

site_list_dict = {
    site1:  "http://www.some-site1.com",
    site2:"http://www.some-site2.com"
    site3:""
    site4:"http://www.some-site4.com"
}

# (This will not work because it will be overwritten with each pass. I would need a unique name for
#   each "soup" variable, preferably assocated with the site key.)
for key,value in site_list_dict():
    try:
        source = requests.get(value, headers=hdr).text
        soup = BeautifulSoup(source, "lxml")

Ответы [ 2 ]

1 голос
/ 06 октября 2019
mySoups = dict()
for key,value in site_list_dict:
    try:
        source = requests.get(value, headers=hdr).text
        soup = BeautifulSoup(source, "lxml")
        mySoups[key] = soup
0 голосов
/ 06 октября 2019

Вы можете попробовать сохранить ваши URL-адреса, например:

url_dict = {
        "site1": "http://www.url1.com",
        "site2": "http://www.url2.com",
        "site3": "http://www.url3.com",
        "site4": "http://www.url4.com",
    }

Если вам не нравится цикл for, вы можете обобщить функцию и затем отобразить ее.

def send_request(url):
    try:
        response = requests.get(url, headers={"content-type":"text"})
        soup = BeautifulSoup(response, "lxml")
        return soup
    except Exception as e:
        raise e

list_of_soups = list(map(send_request, list(url_dict.values())))
# Map it onto a dict directly:
url_dict_final = dict(map(lambda item: (item[0], send_request(item[1])), url_dict.items()))
...