Проблема экспорта результатов Web Url в CSV с использованием Beautifulsoup3 - PullRequest
0 голосов
/ 08 января 2019

Проблема: я пытался экспортировать результаты (имя, адрес, телефон) в CSV, но код CSV не возвращает ожидаемые результаты.

#Import the installed modules
import requests
from bs4 import BeautifulSoup
import json
import re
import csv

#To get the data from the web page we will use requests get() method
url = "https://www.lookup.pk/dynamic/search.aspx?searchtype=kl&k=gym&l=lahore"
page = requests.get(url)

# To check the http response status code
print(page.status_code)

#Now I have collected the data from the web page, let's see what we got
print(page.text)

#The above data can be view in a pretty format by using beautifulsoup's prettify() method. For this we will create a bs4 object and use the prettify method
soup = BeautifulSoup(page.text, 'lxml')
print(soup.prettify())

#Find all DIVs that contain Companies information
product_name_list = soup.findAll("div",{"class":"CompanyInfo"})

#Find all Companies Name under h2tag
company_name_list_heading = soup.findAll("h2")

#Find all Address on page Name under a tag
company_name_list_items = soup.findAll("a",{"class":"address"})

#Find all Phone numbers on page Name under ul
company_name_list_numbers = soup.findAll("ul",{"class":"submenu"})

Создано для цикла для распечатки всех данных компании

for company_address in company_name_list_items:
    print(company_address.prettify())

# Create for loop to print out all company Names
for company_name in company_name_list_heading:
    print(company_name.prettify())

# Create for loop to print out all company Numbers
for company_numbers in company_name_list_numbers:
    print(company_numbers.prettify())

Ниже приведен код для экспорта результатов (имя, адрес и номер телефона) в CSV

    outfile = open('gymlookup.csv','w', newline='')

writer = csv.writer(outfile)

writer.writerow(["name", "Address", "Phone"])

product_name_list = soup.findAll("div",{"class":"CompanyInfo"})
company_name_list_heading = soup.findAll("h2")
company_name_list_items = soup.findAll("a",{"class":"address"})
company_name_list_numbers = soup.findAll("ul",{"class":"submenu"})

Вот цикл for для зацикливания данных.

for company_name in company_name_list_heading:
    names = company_name.contents[0]

for company_numbers in company_name_list_numbers:
    names = company_numbers.contents[1]

for company_address in company_name_list_items:
    address = company_address.contents[1]

    writer.writerow([name, Address, Phone])

outfile.close()

1 Ответ

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

Вам нужно разобраться, как работают циклы, а также разницу между строками, переменными и другими типами данных. Вам также нужно поработать над тем, что вы видели из других вопросов, связанных со стековым потоком, и научиться применять его. По сути, это то же самое, что и другие 2 вопроса, которые вы уже опубликовали, но просто другой сайт, с которого вы копируете (но я не отметил его как дубликат, так как вы новичок в stackoverflow и веб-прокрутке, и я помню, что это было все равно что пытаться учиться). Я по-прежнему отвечу на ваши вопросы, но в конечном итоге вам нужно будет найти ответы самостоятельно и научиться их адаптировать и применять (кодирование - это не краска по цветам. Как я понимаю, вы адаптируете некоторые из них) Хорошая работа по поиску тега "div", {"class": "CompanyInfo"} для получения информации о компании)

Данные, которые вы извлекаете (имя, адрес, телефон), должны находиться во вложенном цикле элемента / тега div class = CompanyInfo. Теоретически вы можете получить его таким, каким он есть сейчас, поместив их в список, а затем записав в файл csv из своих списков, но есть риск потери данных, и тогда ваши данные / информация могут быть отключены или нет с исправить соответствующую компанию.

Вот как выглядит полный код. обратите внимание, что переменные хранятся в цикле, а затем записываются. Затем он переходит к следующему блоку CompanyInfo и продолжает.

#Import the installed modules
import requests
from bs4 import BeautifulSoup
import csv

#To get the data from the web page we will use requests get() method
url = "https://www.lookup.pk/dynamic/search.aspx?searchtype=kl&k=gym&l=lahore"
page = requests.get(url)

# To check the http response status code
print(page.status_code)

#Now I have collected the data from the web page, let's see what we got
print(page.text)

#The above data can be view in a pretty format by using beautifulsoup's prettify() method. For this we will create a bs4 object and use the prettify method
soup = BeautifulSoup(page.text, 'html.parser')
print(soup.prettify())

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


#Find all DIVs that contain Companies information
product_name_list = soup.findAll("div",{"class":"CompanyInfo"})

# Now loop through those elements
for element in product_name_list:

    # Takes 1 block of the "div",{"class":"CompanyInfo"} tag and finds/stores name, address, phone
    name = element.find('h2').text
    address = element.find('address').text.strip()
    phone = element.find("ul",{"class":"submenu"}).text.strip()

    # writes the name, address, phone to csv
    writer.writerow([name, address, phone])

    # now will go to the next "div",{"class":"CompanyInfo"} tag and repeats     

outfile.close()
...