Извлечение тега адреса из HTML с помощью BeautifulSoup

#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-файлов. Приведенный выше исходный код — это то, из чего я хочу, чтобы он исходил. Спасибо, приятель =)