Извлечение подробностей юриста из нескольких ссылок с использованием bs4 в python - PullRequest
2 голосов
/ 08 июня 2019

Я абсолютный новичок в Web Scraping с использованием Python и очень мало знаю о программировании на Python. Я просто пытаюсь получить информацию о юристах в штате Теннесси. На веб-странице есть несколько ссылок, внутри которых есть еще больше ссылок о категориях юристов, и внутри них есть подробности о юристах.

Я уже извлек ссылки различных городов в список, а также выделил различные категории юристов, доступных в каждой из ссылок города. Теперь я пытаюсь получить каждую из ссылок профиля юристов в каждой категории каждого города, откуда я буду получать информацию о юристах. Но пустой список возвращается. Что можно сделать . Если возможно, предложите.

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

res = requests.get('https://attorneys.superlawyers.com/tennessee/', headers = {'User-agent': 'Super Bot 9000'})
soup = bs(res.content, 'lxml')

cities = [item['href'] for item in soup.select('#browse_view a')]
for c in cities:
    r=requests.get(c)
    s1=bs(r.content,'lxml')
    categories = [item['href'] for item in s1.select('.three_browse_columns:nth-of-type(2) a')]
    #print(categories)
    for c1 in categories:
        r1=requests.get(c1)
        s2=bs(r1.content,'lxml')
        lawyers = [item['href'] for item in s2.select('.directory_profile a')]
        print(lawyers)

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

"[][][][][][][]"

Ответы [ 3 ]

2 голосов
/ 08 июня 2019

Вы уже на уровне тега a при использовании селектора классов, который является вашей первой проблемой.

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

Я использую Session для эффективности повторного использования соединения. Я добавляю профили юристов в список и сглаживаю список с помощью установленного понимания, чтобы удалить любые дубликаты.

import requests
from bs4 import BeautifulSoup as bs

final = []
with requests.Session() as s:
    res = s.get('https://attorneys.superlawyers.com/tennessee/', headers = {'User-agent': 'Super Bot 9000'})
    soup = bs(res.content, 'lxml')
    cities = [item['href'] for item in soup.select('#browse_view a')]
    for c in cities:
        r = s.get(c)
        s1 = bs(r.content,'lxml')
        categories = [item['href'] for item in s1.select('.three_browse_columns:nth-of-type(2) a')]
        for c1 in categories:
            r1 = s.get(c1)
            s2 = bs(r1.content,'lxml')
            lawyers = [item['href'].split('*')[1] if '*' in item['href'] else item['href'] for item in s2.select('.indigo_text .directory_profile')]
            final.append(lawyers)
final_list = {item for sublist in final for item in sublist}
1 голос
/ 08 июня 2019

Я пробовал следующее:

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

res = requests.get('https://attorneys.superlawyers.com/tennessee/', headers = {'User-agent': 'Super Bot 9000'})
soup = bs(res.content, 'lxml')

cities = [item['href'] for item in soup.select('#browse_view a')]
for c in cities:
    r=requests.get(c)
    s1=bs(r.content,'lxml')
    categories = [item['href'] for item in s1.select('.three_browse_columns:nth-of-type(2) a')]
    #print(categories)
    for c1 in categories:
        r1=requests.get(c1)
        s2=bs(r1.content,'lxml')
        lawyers = [item['href'] for item in s2.select('#lawyer_0_main a')]
        print(lawyers)

"Это не только ссылки на профили, но также ссылки на другие и другие связанные ссылки, которые не требуются. Мне просто нужны ссылки на профили юристов."

"Выход" отображается как "

"`['https://profiles.superlawyers.com/tennessee/alamo/lawyer/jim-emison/c99a7c4f-3a42-4953-9260-3750f46ed4bd.html', 'https://www.superlawyers.com/about/selection_process.html']
['https://profiles.superlawyers.com/tennessee/alamo/lawyer/jim-emison/c99a7c4f-3a42-4953-9260-3750f46ed4bd.html', 'https://www.superlawyers.com/about/selection_process.html']
['https://profiles.superlawyers.com/tennessee/alamo/lawyer/jim-emison/c99a7c4f-3a42-4953-9260-3750f46ed4bd.html', 'https://www.superlawyers.com/about/selection_process.html']`"
1 голос
/ 08 июня 2019

Из другого поста :

Это происходит потому, что вы не можете использовать nth-of-type () с классифицированным тегом, его можно использовать только для тега, такого как: table: nth-of-type (4).

Ваша переменная categories возвращает пустой список из-за этого.

Обходной путь дан в том же посте:

categories = [item['href'] for item in s1.select('.three_browse_columns a')][1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...