Цикл HTML для синтаксического анализа словаря, но возвращает повторяющееся значение

#python #html #dictionary #parsing

#python #HTML #словарь #синтаксический анализ

Вопрос:

Синтаксический анализ HTML.txt файлы, которые в основном являются частями HTML. У меня есть то, что, как я думал, будет работать, но он повторяет один и тот же адрес для всех ключей (местоположений). Кто-нибудь может найти решение?

 with open('AL.txt','r') as f:
    contents = f.read()    
    soup = BeautifulSoup(contents, 'html.parser')

from collections import defaultdict
result = defaultdict(list)


for div in soup.find_all('div'):
    
    for h in soup.find_all('h2'):
        location = h.find('a').text
        
        for p in soup.find_all('p'): 
            p = p.text.replace('n','|').replace('t','').strip()
            clean = ' '.join(p.split()).replace('| ','|').replace(' |','|').replace('||','|')
            address_clean = clean.replace('| ','|').replace(' |','|').replace('||','|')
            
            result[location]=[address_clean]

            
result
  

что я получаю прямо сейчас:
введите описание изображения здесь

Комментарии:

1. for p in soup.find_all('p') всегда будет возвращать все абзацы, независимо от того, в каком месте документа они появляются. Поэтому ваш сценарий всегда повторяет все абзацы, постоянно перезаписывая result[location] . Вам нужно будет найти следующий <p> после текущего <h2><a> .

2. знаете ли вы, как я могу обновить свой код, чтобы исправить это?

3. Зависит от структуры вашего HTML-кода. Следует ли <p> непосредственно за <h2> тегом?

4. Просто предположение: возможно, вы захотите попробовать p = h.find_next_sibling("p") вместо for p in soup.find_all('p'): того, чтобы получить следующий абзац после текущего заголовка2. Я бы также рекомендовал добавлять местоположения и адреса в новую коллекцию вместо повторного result использования объекта, но это полностью зависит от варианта использования.

5. Просто общий совет: вы можете получить больше просмотров и помощи, если примете ответы в качестве решений, установив галочку под ответом, который помог вам решить проблему. Прямо сейчас я вижу, что вы не отметили ни один из ваших вопросов как решенный.