Очистка разбитых на страницы результатов с помощью python beautifulsoup 3 - PullRequest
0 голосов
/ 08 января 2019

Я могу написать код для первых и последних страниц, но могу извлечь только данные страницы 1 в CSV. Мне нужно извлечь все 10 страниц данных в CSV. Где в коде я иду не так?

Импорт установленных модулей

import requests
from bs4 import BeautifulSoup
import csv

Для получения данных с веб-страницы мы будем использовать метод запросов get ()

url = "https://www.lookup.pk/dynamic/search.aspx?searchtype=kl&k=gym&l=lahore"
page = requests.get(url)

Для проверки http статуса кода ответа

print(page.status_code)

Теперь я собрал данные с веб-страницы, посмотрим, что мы получили

print(page.text)

Приведенные выше данные можно просмотреть в симпатичном формате с помощью метода prettify () Beautifulsoup. Для этого мы создадим объект bs4 и используем метод prettify

soup = BeautifulSoup(page.text, 'html.parser')
print(soup.prettify())

outfile = open('gymlookup.csv','w', newline='')
writer = csv.writer(outfile)
writer.writerow(["Name", "Address", "Phone"])

Найти все DIV, содержащие информацию о компаниях

product_name_list = soup.findAll("div",{"class":"CompanyInfo"})

Для извлечения номера первой и последней страницы

paging = soup.find("div",{"class":"pg-full-width me-pagination"}).find("ul",{"class":"pagination"}).find_all("a")
start_page = paging[1].text
last_page = paging[len(paging)-2].text

Теперь переберите эти элементы

for element in product_name_list:

Принимает 1 блок тега "div", {"class": "CompanyInfo"} и находит / сохраняет имя, адрес, телефон

name = element.find('h2').text
address = element.find('address').text.strip()
phone = element.find("ul",{"class":"submenu"}).text.strip()

записывает имя, адрес, телефон в csv

writer.writerow([name, address, phone])

теперь перейдет к следующему тегу "div", {"class": "CompanyInfo"} и повторится

outfile.close()

Ответы [ 2 ]

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

Просто нужно больше петель. теперь вам нужно просмотреть каждый URL-адрес страницы: см. ниже.

import requests
from bs4 import BeautifulSoup
import csv

root_url = "https://www.lookup.pk/dynamic/search.aspx?searchtype=kl&k=gym&l=lahore"
html = requests.get(root_url)
soup = BeautifulSoup(html.text, 'html.parser')

paging = soup.find("div",{"class":"pg-full-width me-pagination"}).find("ul",{"class":"pagination"}).find_all("a")
start_page = paging[1].text
last_page = paging[len(paging)-2].text


outfile = open('gymlookup.csv','w', newline='')
writer = csv.writer(outfile)
writer.writerow(["Name", "Address", "Phone"])


pages = list(range(1,int(last_page)+1))
for page in pages:
    url = 'https://www.lookup.pk/dynamic/search.aspx?searchtype=kl&k=gym&l=lahore&page=%s' %(page)
    html = requests.get(url)
    soup = BeautifulSoup(html.text, 'html.parser')

    #print(soup.prettify())
    print ('Processing page: %s' %(page))

    product_name_list = soup.findAll("div",{"class":"CompanyInfo"})
    for element in product_name_list:
        name = element.find('h2').text
        address = element.find('address').text.strip()
        phone = element.find("ul",{"class":"submenu"}).text.strip()

        writer.writerow([name, address, phone])

outfile.close()
print ('Done')  
0 голосов
/ 08 января 2019

Вы должны использовать атрибут страницы, например, https://www.lookup.pk/dynamic/search.aspx?searchtype=kl&k=gym&l=lahore&page=2

Пример кода для 10 страниц:

url = "https://www.lookup.pk/dynamic/search.aspx?searchtype=kl&k=gym&l=lahore&page={}"
for page_num in range(1, 10):
   page = requests.get(url.format(page_num)
   #further processing
...