Извлечение информации из различных ссылок на веб-странице и запись их в файл .xls с использованием pandas, bs4 в Python - PullRequest
0 голосов
/ 01 апреля 2019

Я новичок в программировании на Python. Я занимаюсь веб-чисткой с использованием модуля bs4 в Python.

Я извлек некоторые поля с веб-страницы, но она извлекает только 13 элементов, тогда как на веб-странице содержится более 13 элементов. Я не могу понять, почему остальные предметы не извлечены.

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

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


res = requests.post('https://www.nelsonalexander.com.au/real-estate-agents/?office=&agent=A')
soup = bs(res.content, 'lxml')

data = soup.find_all("div",{"class":"agent-card large large-3 medium-4 small-12 columns text-center end"})

records = []

for item in data:
    name = item.find('h2').text.strip()
    position = item.find('h3').text.strip()
    records.append({'Names': name, 'Position': position})

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

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

Лист Excel выглядит так:

enter image description here

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Я убежден, что электронные письма не находятся где-то в DOM.Я сделал некоторые изменения в коде @ drec4s, чтобы вместо этого идти, пока нет записей (динамически).

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

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0', 'Referer': 'https://www.nelsonalexander.com.au/real-estate-agents/?office=&agent=A'}
records = []

with requests.Session() as s:


    for i in itertools.count():

        res = s.get('https://www.nelsonalexander.com.au/real-estate-agents/page/{}/?ajax=1&agent=A'.format(i), headers=headers)
        soup = bs(res.content, 'lxml')

        data = soup.find_all("div",{"class":"agent-card large large-3 medium-4 small-12 columns text-center end"})
        if(len(data) > 0):
            for item in data:
                name = item.find('h2').text.strip()
                position = item.find('h3').text.strip()
                phone = item.find("div",{"class":"small-6 columns text-left"}).find("a").get('href').replace("tel:", "")
                records.append({'Names': name, 'Position': position, 'Phone': phone})
                print({'Names': name, 'Position': position, 'Phone': phone})
        else:
            break
0 голосов
/ 01 апреля 2019

Этот веб-сайт динамически загружает список при прокрутке, однако вы можете отслеживать запрос ajax и анализировать данные напрямую:

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

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0', 'Referer': 'https://www.nelsonalexander.com.au/real-estate-agents/?office=&agent=A'}
records = []

with requests.Session() as s:

    for i in range(1, 22):

        res = s.get(f'https://www.nelsonalexander.com.au/real-estate-agents/page/{i}/?ajax=1&agent=A', headers=headers)
        soup = bs(res.content, 'lxml')

        data = soup.find_all("div",{"class":"agent-card large large-3 medium-4 small-12 columns text-center end"})

        for item in data:
            name = item.find('h2').text.strip()
            position = item.find('h3').text.strip()
            phone = item.find("div",{"class":"small-6 columns text-left"}).find("a").get('href').replace("tel:", "")
            records.append({'Names': name, 'Position': position, 'Phone': phone})

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