Arhn - архитектура программирования

разбор 1 таблицы из html с несколькими таблицами

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

если я разобью его только на один URL-адрес, я смогу распечатать информацию из лицензии. Но я не могу заставить его работать для нескольких URL-адресов. я чувствую, что я полностью усложняю вещи.

Вот несколько примеров URL-адресов, которые я пытаюсь запустить:

http://search.ccb.state.or.us/search/business_details.aspx?id=221851
http://search.ccb.state.or.us/search/business_details.aspx?id=221852
http://search.ccb.state.or.us/search/business_details.aspx?id=221853

Код весь измучен, но вот что у меня есть

Я ценю любую помощь

import csv
from urllib.request import urlopen
import pandas as pd
from bs4 import BeautifulSoup as BS
from email import encoders
import time
import os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase

def get_page():
    contents = []
    with open('OR_urls.csv','r') as csvf:
    urls = 'csv.reader(csvf)'
    r = requests.get(url)


data = {}

data['biz_info_object'] = soup(id='MainContent_contractornamelabel')[0].text.strip()
data['lic_number_object'] = soup(id='MainContent_licenselabel')[0].text.strip()
data['lic_date_object']  = soup(id='MainContent_datefirstlabel')[0].text.strip()
data['lic_status_object']  = soup(id='MainContent_licensestatuslabel')[0].text.strip()
data['lic_exp_object']  = soup(id='MainContent_licenseexpirelabel')[0].text.strip()
data['biz_address_object']  = soup(id='MainContent_addresslabel')[0].text.strip()
data['biz_phone_object']  = soup(id='MainContent_phonelabel')[0].text.strip()
data['biz_address_object']  = soup(id='MainContent_endorsementlabel')[0].text.strip()


with open('OR_urls.csv','r') as csvf: # Open file in read mode
    urls = csv.reader(csvf)
    for url in urls:
        page = ('get_page')
        df1 = pd.read_html(page)

  • Ну, можешь, пожалуйста, исправить отступ? 23.09.2018
  • Извини за это. спасибо, что поймал. 23.09.2018
  • Можете ли вы добавить несколько примеров URL-адресов из OR-urls.csv, чтобы мы могли запустить ваш скрипт? Также page = ('get_page') не имеет смысла? 23.09.2018
  • просто добавил несколько URL-адресов для просмотра. Кроме того, вы правы, page = ('get_page') не имеет смысла. я новичок в этом и учусь на ходу, и мой мозг превратился в кашу после пары часов попыток понять это. Я попробовал несколько решений из поста на SO и, вероятно, смешал пару из них ближе к концу. :-/ 23.09.2018

Ответы:


1

Как вы сказали, похоже, вы объединили несколько разных сценариев. Надеемся, что следующее поможет вам лучше понять требуемую структуру.

Я предполагаю, что ваш файл OR_urls.csv содержит ваши URL-адреса в первом столбце. Он считывает строку за раз из CSV-файла и использует библиотечный вызов requests.get() для возврата веб-страницы. Затем он анализируется с помощью BeautifulSoup, и ваши различные элементы извлекаются со страницы в словарь. Затем он отображается вместе с URL-адресом.

from bs4 import BeautifulSoup
import requests
import csv

with open('OR_urls.csv') as f_input:
    csv_input = csv.reader(f_input)

    for url in csv_input:
        r = requests.get(url[0])        # Assume the URL is in the first column
        soup = BeautifulSoup(r.text, "html.parser")

        data = {}

        data['biz_info_object'] = soup.find(id='MainContent_contractornamelabel').get_text(strip=True)
        data['lic_number_object'] = soup.find(id='MainContent_licenselabel').get_text(strip=True)
        data['lic_date_object']  = soup.find(id='MainContent_datefirstlabel').get_text(strip=True)
        data['lic_status_object']  = soup.find(id='MainContent_licensestatuslabel').get_text(strip=True)
        data['lic_exp_object']  = soup.find(id='MainContent_licenseexpirelabel').get_text(strip=True)
        data['biz_address_object']  = soup.find(id='MainContent_addresslabel').get_text(strip=True)
        data['biz_phone_object']  = soup.find(id='MainContent_phonelabel').get_text(strip=True)
        data['biz_address_object']  = soup.find(id='MainContent_endorsementlabel').get_text(strip=True)

        print(url[0], data)

Предоставление вам следующего вывода:

http://search.ccb.state.or.us/search/business_details.aspx?id=221851 {'biz_info_object': 'ANDREW LLOYD PARRY', 'lic_number_object': '221851', 'lic_date_object': '7/17/2018', 'lic_status_object': 'Active', 'lic_exp_object': '7/17/2020', 'biz_address_object': 'Residential General Contractor', 'biz_phone_object': '(802) 779-7180'}
http://search.ccb.state.or.us/search/business_details.aspx?id=221852 {'biz_info_object': 'SHANE MICHAEL DALLMAN', 'lic_number_object': '221852', 'lic_date_object': '7/17/2018', 'lic_status_object': 'Active', 'lic_exp_object': '7/17/2020', 'biz_address_object': 'Residential General Contractor', 'biz_phone_object': '(503) 933-5406'}
http://search.ccb.state.or.us/search/business_details.aspx?id=221853 {'biz_info_object': 'INTEGRITY HOMES NW INC', 'lic_number_object': '221853', 'lic_date_object': '7/24/2018', 'lic_status_object': 'Active', 'lic_exp_object': '7/24/2020', 'biz_address_object': 'Residential General Contractor', 'biz_phone_object': '(503) 522-6055'}

Вы можете еще больше улучшить это, создав список для всех идентификаторов, которые вы хотите, и используя понимание словаря для его создания. csv.DictWriter() можно использовать для записи данных в файл CSV:

from bs4 import BeautifulSoup
import requests
import csv

objects = (
    ('biz_info_object', 'MainContent_contractornamelabel'),
    ('lic_number_object', 'MainContent_licenselabel'),
    ('lic_date_object', 'MainContent_datefirstlabel'),
    ('lic_status_object', 'MainContent_licensestatuslabel'),
    ('lic_exp_object', 'MainContent_licenseexpirelabel'),
    ('biz_address_object', 'MainContent_addresslabel'),
    ('biz_phone_object', 'MainContent_phonelabel'),
    ('biz_address_object', 'MainContent_endorsementlabel'),
)

with open('OR_urls.csv') as f_input, open('output.csv', 'w', newline='')  as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.DictWriter(f_output, fieldnames=[name for name, id in objects])
    csv_output.writeheader()

    for url in csv_input:
        r = requests.get(url[0])        # Assume the URL is in the first column
        soup = BeautifulSoup(r.text, "html.parser")
        data = {name : soup.find(id=id).get_text(strip=True) for name, id in objects}        
        csv_output.writerow(data)
24.09.2018
  • Это замечательно. лол... бессонница - это плохо. Большое спасибо за вашу помощь в этом. 24.09.2018
  • Пожалуйста! Это также может быть немного улучшено с пониманием словаря. 24.09.2018
  • как только все URL-адреса будут запущены, он перенесет информацию в CSV-файл, который будет автоматически отправлен по электронной почте нескольким людям. Автоматизация подобных процессов сэкономила мне оооочень много времени. Итак, еще раз .. я очень ценю помощь. 24.09.2018
  • Привет, Мартин, мне было интересно, есть ли способ установить это во фрейм данных, который я могу экспортировать в Excel. (надеюсь, я использую правильную формулировку) 24.09.2018
  • Вы можете легко записать его в формате CSV, я обновил скрипт, чтобы показать, как это сделать. Если нужен формат Excel, я бы посоветовал взглянуть на библиотеку openpyxl. 24.09.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..