Как извлечь те же вложенные данные из списка URL-адресов с помощью BeautifulSoup - PullRequest
0 голосов
/ 20 февраля 2019

Добрый день,

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

Главная страница = http://www.therentalshow.com/find-exhibitors/sb-search/equipment/sb-inst/8678/sb-logid/242109-dcja1tszmylg308y/sb-page/1 Вложенная страница = http://www.therentalshow.com/exhibitor-detail/cid/45794/exhib/2019

Мне удалось составить этот список URL-адресов, но мне сложнее всего собрать информацию о каждой отдельной компании ивывод в CSV в табличном формате.

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import requests
import pandas as pd
import csv, os

my_url = 'http://www.therentalshow.com/find-exhibitors/sb-search/equipment/sb-inst/8678/sb-logid/242109-dcja1tszmylg308y/sb-page/1'
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
page_soup = soup(page_html, 'lxml')

#create list of urls from main page
urls = []
tags = page_soup.find_all('a',{'class':'avtsb_title'})
for tag in tags:
    urls.append('http://www.therentalshow.com' + tag.get('href'))

#iterate through each page to return company data
for url in urls:
    site = uReq(url)
    soups = soup(site, 'lxml')

    name = page_soup.select('h2')
    address = page_soup.find('span',{'id':'dnn_ctr8700_TRSExhibitorDetail_lblAddress'})
    city = page_soup.find('span',{'id':'dnn_ctr8700_TRSExhibitorDetail_lblCityStateZip'})
    phone = page_soup.find('span',{'id':'dnn_ctr8700_TRSExhibitorDetail_lblPhone'})
    website = page_soup.find('a',{'id':'dnn_ctr8700_TRSExhibitorDetail_hlURL'})

    os.getcwd()
    outputFile = open('output2.csv', 'a', newline='')
    outputWriter = csv.writer(outputFile)
    outputWriter.writerow([name, address, city, phone, website])

Мой возвращенный результат - всего

[],,,,
[],,,,

99 строк.Мой общий список ссылок - 100.

Я хотел бы, чтобы имена вышеупомянутых переменных были заголовками для моего CSV-файла, но мой текущий вывод - не то, что я ищу.Я совершенно потерян, поэтому ЛЮБАЯ помощь будет очень цениться.Спасибо!

1 Ответ

0 голосов
/ 20 февраля 2019

В настоящее время я не могу полностью протестировать, поскольку requests зависает, но вам нужно извлечь .text возвращенных элементов.Кроме того, ваш первый выбор - это список, поэтому измените его, например, на select_one или внесите соответствующий указатель в список.Я предпочитаю css-селекторы, а не find.

Я извлек html с одной страницы в переменную html

page_soup = bs(html, 'lxml')
name = page_soup.select_one('h2').text
address = page_soup.select_one('#dnn_ctr8700_TRSExhibitorDetail_lblAddress').text
city = page_soup.select_one('#dnn_ctr8700_TRSExhibitorDetail_lblCityStateZip').text
phone = page_soup.select_one('#dnn_ctr8700_TRSExhibitorDetail_lblPhone').text
website = page_soup.select_one('#dnn_ctr8700_TRSExhibitorDetail_hlURL').text
print([name, address, city, phone, website])

Копирование html из первых двух ссылок с указанными выше изменениями дает:

['A-1 Scaffold Manufacturing', '590 Commerce Pkwy', 'Hays, KS', '785-621-5121', 'www.a1scaffoldmfg.com']
['Accella Tire Fill Systems', '2003 Curtain Pole Rd', 'Chattanooga, TN', '423-697-0400', 'www.accellatirefill.com']
...