#python-3.x #beautifulsoup
#python-3.x #beautifulsoup
Вопрос:
Похоже, не удается создать следующий HTML:
[<address class="styles_address__zrPvy"><svg class="styles_addressIcon__3Pu3L" height="42" viewbox="0 0 32 42" width="32" xmlns="http://www.w3.org/2000/svg"><path d="M14.381 41.153C2.462 23.873.25 22.1.25 15.75.25 7.051 7.301 0 16 0s15.75 7.051 15.75 15.75c0 6.35-2.212 8.124-14.131 25.403a1.97 1.97 0 01-3.238 0zM16 22.313a6.562 6.562 0 100-13.125 6.562 6.562 0 000 13.124z"></path></svg>Level 1 44 Market Street<!-- -->, <!-- -->Sydney</address>]
«Заголовок» работает нормально, но «адрес» не извлекается.
path = "C:\Users\mpeter\Downloads\lksd\"
titleList = []
for infile in glob.glob(os.path.join(path, "*.html")):
markup = (infile)
soup = BeautifulSoup(open(markup, "r").read(), 'lxml')
title = soup.find_all("title")
title = soup.title.string
titleList.append(title)
streetAddressList = []
for infile in glob.glob(os.path.join(path, "*.html")):
markup = (infile)
soup = BeautifulSoup(open(markup, "r").read(), 'lxml')
address = soup.find_all("address", class_={"styles_address__zrPvy"})
address = soup.address.string
streetAddressList.append(address)
with open('output2.csv', 'w') as myfile:
writer = csv.writer(myfile)
writer.writerows((titleList, streetAddressList))
Когда я извлекаю address = soup.address.string, он работает, но извлекает весь элемент.
Комментарии:
1. Вы могли бы использовать
regex
только для поиска адреса. Когда у вас уже есть весь элемент вadress
2. @grumpyp, сейчас изучаю это. Любые указания на то, как это будет сделано, я предполагаю, что ‘address = re.compile (r «Что-то»)’. Не уверен, что нужно вставить во что-то.
Ответ №1:
Используя findall, мы можем получить весь согласованный контент. затем нужно выполнить итерацию по результирующему набору, чтобы получить каждое содержимое.
используйте этот код:
from bs4 import BeautifulSoup
import pandas as pd
strs = '[<address class="styles_address__zrPvy"><svg class="styles_addressIcon__3Pu3L" height="42" viewbox="0 0 32 42" width="32" xmlns="http://www.w3.org/2000/svg"><path d="M14.381 41.153C2.462 23.873.25 22.1.25 15.75.25 7.051 7.301 0 16 0s15.75 7.051 15.75 15.75c0 6.35-2.212 8.124-14.131 25.403a1.97 1.97 0 01-3.238 0zM16 22.313a6.562 6.562 0 100-13.125 6.562 6.562 0 000 13.124z"></path></svg>Level 1 44 Market Street<!-- -->, <!-- -->Sydney</address>] [<address class="styles_address__zrPvy"><svg class="styles_addressIcon__3Pu3L" height="42" viewbox="0 0 32 42" width="32" xmlns="http://www.w3.org/2000/svg"><path d="M14.381 41.153C2.462 23.873.25 22.1.25 15.75.25 7.051 7.301 0 16 0s15.75 7.051 15.75 15.75c0 6.35-2.212 8.124-14.131 25.403a1.97 1.97 0 01-3.238 0zM16 22.313a6.562 6.562 0 100-13.125 6.562 6.562 0 000 13.124z"></path></svg>14, Bengaluru<!-- -->, <!-- -->India</address>]'
soup = BeautifulSoup(strs, 'lxml')
addresses = soup.find_all(class_={"styles_address__zrPvy"})
addr = []
df = pd.DataFrame()
for address in addresses:
addr.append(address.text)
df['address'] = addr
df
Вывод:
address
0 Level 1 44 Market Street, Sydney
1 14, Bengaluru, India
теперь список адресов находится в Dataframe. вы можете записать этот фрейм данных в csv с помощью df.to_csv()
Комментарии:
1. Эй, это не работает, так как это «soup.find_all». Причина этого в том, что я извлекаю его из нескольких файлов. Любая помощь будет очень признательна
2. Обновлен ответ с помощью findall()
3. Привет, Саббу, извините, но как мне реализовать это, чтобы он записывал список в CSV? Как вы можете видеть из моего примера выше, он имеет это в качестве конечной функции. Мы очень ценим вашу помощь.
4. обновлен ответ созданием фрейма данных и записью в файл csv
5. Привет @Subbu VidyaSekar, извините за беспокойство, но не могли бы вы изменить его, чтобы он использовал функцию ‘glob’, поскольку она извлекается из локальных HTML-файлов. Приведенный выше исходный код — это то, из чего я хочу, чтобы он исходил. Спасибо, приятель =)