Извлечение атрибутов с веб-сайта, а затем удаление повторяющихся элементов в списке с помощью pandas, bs4 в Python и запись его в файл .xls - PullRequest
0 голосов
/ 29 марта 2019

Я новичок в программировании на Python, и я практикую чистку различных значений с веб-сайтов. Я извлек элементы из определенного веб-сайта и теперь хочу записать их в файл .xls.

На веб-странице около 715 записей, среди которых есть дубликаты. Я использовал модуль Panda с именем unique (), чтобы удалить дубликаты элементов. Это занимает много времени, и процесс продолжается и продолжается без конца. Я понятия не имею, удаляет ли он дублирующиеся записи или нет. Пожалуйста, скажите, где я делаю что-то не так и, если возможно, предложите, что делать.

from bs4 import BeautifulSoup as bs
import pandas as pd

res = requests.get('https://www.raywhite.com/contact/?type=People&target=people&suburb=Sydney%2C+NSW+2000&radius=50%27%27&firstname=&lastname=&_so=contact', headers = {'User-agent': 'Super Bot 9000'})
soup = bs(res.content, 'lxml')

data = soup.find_all("div",{"class":"card horizontal-split vcard"})

records = []

for item in data:
    name      = item.find('li', class_='agent-name').text
    position  = item.find('li',class_='agent-role').text
    phone     = item.find('li', class_='agent-officenum').text
    #link = item.find('li', class_='agent-name')['href']

    try:
        email = item.find('a', class_='val withicon')['href']
    except:
        email = 'No Email address'
    records.append({'Names':name,'Position':position,'Email':email,'Phone':phone})

for i in records:
    nl=pd.unique(name).tolist()
    pl=pd.unique(position).tolist()
    el=pd.unique(email).tolist()
    phl=pd.unique(phone).tolist()
    records.append({'Names': nl, 'Position': pl, 'Email': el, 'Phone': phl})

df = pd.DataFrame(records,columns=['Names','Position','Phone','Email'])
df.to_excel(r'C:\Users\laptop\Desktop\RayWhite.xls', sheet_name='MyData2', index = False, header=True)

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Не нужно делать цикл.Таким образом, вместо:

    for i in records:
        nl=pd.unique(name).tolist()
        pl=pd.unique(position).tolist()
        el=pd.unique(email).tolist()
        phl=pd.unique(phone).tolist()
        records.append({'Names': nl, 'Position': pl, 'Email': el, 'Phone': phl})


df = pd.DataFrame(records,columns=['Names','Position','Phone','Email'])

я бы просто взял ваш список словарей (records), преобразовал бы в фрейм данных

df = pd.DataFrame(records)    

, а затем отбросил повторяющиеся строки:

df = df.drop_duplicates()    

Я также добавил .strip() к вашим данным, чтобы убрать часть того пробела, который появлялся с телефонными номерами и еще много чего

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

res = requests.get('https://www.raywhite.com/contact/?type=People&target=people&suburb=Sydney%2C+NSW+2000&radius=50%27%27&firstname=&lastname=&_so=contact', headers = {'User-agent': 'Super Bot 9000'})
soup = bs(res.content, 'lxml')

data = soup.find_all("div",{"class":"card horizontal-split vcard"})

records = []

for item in data:
    name      = item.find('li', class_='agent-name').text.strip()
    position  = item.find('li',class_='agent-role').text.strip()
    phone     = item.find('li', class_='agent-officenum').text.strip()
    #link = item.find('li', class_='agent-name')['href']

    try:
        email = item.find('a', class_='val withicon')['href']
    except:
        email = 'No Email address'
    records.append({'Names':name,'Position':position,'Email':email,'Phone':phone})

df = pd.DataFrame(records)
df = df.drop_duplicates()


df.to_excel(r'C:\Users\laptop\Desktop\RayWhite.xls', sheet_name='MyData2', index = False, header=True)
0 голосов
/ 29 марта 2019

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

Таким образом, вместо использования переменной "records" во втором цикле, вот так:

records.append({'Names': nl, 'Position': pl, 'Email': el, 'Phone': phl})

изменить его имя на что-то вроде «unique_records»:

unique_records.append({'Names': nl, 'Position': pl, 'Email': el, 'Phone': phl})

Вот полностью обновленный код:

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

res = requests.get('https://www.raywhite.com/contact/?type=People&target=people&suburb=Sydney%2C+NSW+2000&radius=50%27%27&firstname=&lastname=&_so=contact', headers = {'User-agent': 'Super Bot 9000'})
soup = bs(res.content, 'lxml')

data = soup.find_all("div",{"class":"card horizontal-split vcard"})

records = []
unique_records = []

for item in data:
    name      = item.find('li', class_='agent-name').text
    position  = item.find('li',class_='agent-role').text
    phone     = item.find('li', class_='agent-officenum').text
    #link = item.find('li', class_='agent-name')['href']

    try:
        email = item.find('a', class_='val withicon')['href']
    except:
        email = 'No Email address'
    records.append({'Names':name,'Position':position,'Email':email,'Phone':phone})

for i in records:
    nl=pd.unique(name).tolist()
    pl=pd.unique(position).tolist()
    el=pd.unique(email).tolist()
    phl=pd.unique(phone).tolist()
    unique_records.append({'Names': nl, 'Position': pl, 'Email': el, 'Phone': phl})

df = pd.DataFrame(unique_records,columns=['Names','Position','Phone','Email'])
df.to_excel(r'C:\Users\laptop\Desktop\RayWhite.xls', sheet_name='MyData2', index = False, header=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...