Не могу отделить имена и даты от словаря, чтобы записать их в файл Excel - PullRequest
0 голосов
/ 23 января 2019

Я создал скрипт на python, чтобы анализировать названия компаний и их даты с веб-страницы и записывать их в файл excel с помощью openpyxl. Мое намерение состоит в том, чтобы поместить имена и даты в отдельные столбцы, такие как name1 date1 name2 date2 и т. Д.

Моя текущая попытка может извлечь содержимое из словаря и вывести результат, как показано ниже:

{'NATIONAL OPERA STUDIO': '18 Nov 2010', 'NATIONAL THEATRE BALLET SCHOOL': '12 Aug 2005', 'NATIONAL THEATRE DRAMA SCHOOL': '12 Aug 2005', 'NATIONAL THEATRE': '30 Mar 2000'}

Как разместить имена и даты в файле Excel следующим образом?

column1                 column2       column3                           column4  
NATIONAL OPERA STUDIO   18 Nov 2010   NATIONAL THEATRE BALLET SCHOOL    12 Aug 2005

Это моя попытка:

import re
import requests
from bs4 import BeautifulSoup
from openpyxl import load_workbook

wb = load_workbook('container.xlsx')
ws = wb['Sheet1']

url = "https://abr.business.gov.au/ABN/View?id=78007306283"

response = requests.get(url)
soup = BeautifulSoup(response.text,'lxml')
try:
    names_n_dates = {item.find("a").get_text(strip=True):' '.join(item.find("a").find_parent().find_next_sibling().text.split()) for item in soup.find("th",text=re.compile("Business name",re.I)).find_parent().find_next_siblings("tr")}
except AttributeError: names_n_dates = ""

items = {k:v for k,v in names_n_dates.items()}
print(items)

ws.append([items.split()])
wb.save("container.xlsx")

Я знаю, что не могу применить функцию разделения к словарю, но я не знаю альтернативных опций eiter для достижения того же. Я использовал ws.append ([]) , чтобы включить поля в файл Excel, и я хочу сохранить эту команду такой, какая она есть, потому что есть другие поля, которые будут включены в нее позже.

Ответы [ 2 ]

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

Если вы хотите сохранить ws.append() так, как вы хотите (добавив один список в одну строку), сделайте следующее:

import re
import requests
from bs4 import BeautifulSoup
from openpyxl import load_workbook

wb = load_workbook('container.xlsx')
ws = wb['Sheet1']

url = "https://abr.business.gov.au/ABN/View?id=78007306283"

response = requests.get(url)
soup = BeautifulSoup(response.text,'lxml')
try:
    names_n_dates = {item.find("a").get_text(strip=True):' '.join(item.find("a").find_parent().find_next_sibling().text.split()) for item in soup.find("th",text=re.compile("Business name",re.I)).find_parent().find_next_siblings("tr")}
except AttributeError: names_n_dates = ""

row = []

for item in names_n_dates.items():
   for column in item:
       row.append(column)

ws.append(row)

wb.save("container.xlsx")
0 голосов
/ 23 января 2019

Чтобы решить эту проблему, вы можете перебрать элементы словаря, которые являются кортежами (ключ, значение), а затем получить ключ и значение каждого из этих элементов, таких как список. Ключ находится в позиции 0 элемента, а значение - в позиции 1.

import re
import requests
from bs4 import BeautifulSoup
from openpyxl import load_workbook

wb = load_workbook('container.xlsx')
ws = wb['Sheet1']

url = "https://abr.business.gov.au/ABN/View?id=78007306283"

response = requests.get(url)
soup = BeautifulSoup(response.text,'lxml')
try:
    names_n_dates = {item.find("a").get_text(strip=True):' '.join(item.find("a").find_parent().find_next_sibling().text.split()) for item in soup.find("th",text=re.compile("Business name",re.I)).find_parent().find_next_siblings("tr")}
except AttributeError: names_n_dates = ""

row = []

for item in dict.items(): #iterate over all dict items
   row.append(item[0]) #key
   row.append(item[1]) #value

ws.append(row)

wb.save("container.xlsx")
...