Не удается извлечь текст (BeautifulSoup) веб-очистка python

#python #web-scraping

#python #веб-очистка

Вопрос:

Я пытаюсь извлечь адрес из приведенного ниже источника html в «br» в конце, но я не могу извлечь и не знаю, что указывать в качестве атрибутов. Я использую приведенный ниже код для извлечения адреса, но он работает не так, как ожидалось. Любая помощь очень ценится.

Редактировать: я скопировал недостающие части кода ниже.

Полный исходный код:

 [<div class="card dl">
 <span id="section-1"></span>
 <div class="card-header pb-1 px-1"><!-- Betriebsname -->
 <h3 class="card-title mb-0">
 <!-- <img src="https://www.tk-aerztefuehrer.de/TK/images/EntryType_person1.svg" alt=" " /> amp;nbsp;-->Praxis Dr. Christina Balduhn </h3>
 <!-- ***** HINWEIS PRIVAT ***** -->
 <!-- ************************** -->
 </div>
 <div class="card-body px-1"><!--  panel-body - einzelne Eintrag anfang   -->
 <div class="row">
 <div class="col-sm-5">
 <strong><a href="https://www.tk-aerztefuehrer.de/TK/Suche_SN/index.js?a=DDamp;amp;sid=amp;amp;e_id=830057amp;amp;Db=" style="text-decoration:underline;" title="Details zum Eintrag ansehen">Frau Dr. med. Christina Balduhn</a></strong>
 <br/><span style="color:#666;">Fachärztin für Allgemeinmedizin</span>
 <!--  ********
 <br /><br><span style="color:#7fb7c4; font-weight:700;">Praxis jetzt geöffnet</span>
 
 
 
 <p class="mt-3">Telefon: <a href="tel: 4952531717" class="it">0 52 53 / 17 17</a></p>
 
 **********  -->
 <br/>
 <!-- Fachgebiet:<br>Allgemeinmedizin<br><br />  -->
 <!-- ********* ArztImage Neu ******* -->
 <!-- ************** ArztImage Neu e ************* -->
 </div><!--  #sm-5 end  -->
 <div class="col-sm-4">
 <!--  ***********************************************  -->
 <div class="d-none d-md-block">
 <a class="btn btn-outline-secondary arrow-r" href="https://www.tk-aerztefuehrer.de/TK/Suche_SN/index.js?a=DDamp;amp;sid=amp;amp;e_id=830057amp;amp;Db=" title="Zur Detailseite">Zur Detailseite</a>
 <!-- OTB Termin finden desktop  **** -->
 <!-- ***  -->
 </div>
 <!-- <img class="mapicons" src="https://www.tk-aerztefuehrer.de/TK/images/GoogleImages/A.png" alt=" " /><br>  -->
 <!--  *********
 <br>
 <img src="https://www.tk-aerztefuehrer.de/TK/img/entfernung.svg" alt=" " />  0.2 km<br />
 <br>
 
 
 
 Tegelhof 1<br />
 33014 Bad Driburg<br />
 <br />
 *********  -->
 <p class="show-xs show sm"></p>
 </div><!--  #sm-4 end  -->
 <div class="col-sm-3">
 <!-- ###################################################
 <div>
 <a class="btn btn-primary" title="Details zum Eintrag ansehen" href="">Details zum Eintrag</a>
 </div>
 
 <div style="margin:1em 0;">
 <a class="btn btn-default" title="Bewertung geben" href="https://www.tk-aerztefuehrer.de/TK/Arzt-Auskunft/Suche_SN/index.js?a=FRamp;e_id=830057amp;db=">Bewertung geben</a>
 </div>
 
 
 <span class="empf-0" title="Noch keine Bewertung(en) vorhanden">amp;nbsp;0 Bewertung(en)</span>
 ############################
 
 <div style="margin: 0 0 1em 0;">
 <a style="width:70%;" class="btn btn-primary" title="Bewertung geben" href="https://www.tk-aerztefuehrer.de/TK/Suche_SN/index.js?a=FRamp;e_id=830057amp;db=">Bewertung geben <i class="fa fa-angle-right" style="padding-left:1.1em;"></i></a>
 </div>
 
 ################################################  -->
 <!-- Bewertungstatus (1-5 Punkte)  -->
 <img src="https://www.tk-aerztefuehrer.de/TK/img/rategrade-0.png" title="Keine Bewertungen vorhanden"/>
 <br/>
 <span class="empf-0" title="Noch keine Bewertung(en) vorhanden">0 Bewertung(en)</span>
 <!--  ***********************  OTB  ******************
 ******************************************  -->
 </div><!-- sm-3 end -->
 </div><!--   end row -->
 <div class="row"><!-- Eintrag End - Abstand zw. Einträge -->
 <div class="col-sm-12">
 <!--  ************  OTV  *************  -->
 <!--  ******** 
 <!--  ************  OTV e  *************  -->
 </div><!-- sm-12 end -->
 </div><!--   end row  -->
 <!--  2020 A  -->
 <!--     ###########  Row 2 ################# -->
 <div class="row">
 <div class="col-sm-5 py-2">
 <br/><span style="color:#7fb7c4; font-weight:600;">Praxis jetzt geöffnet</span>
 <p class="mt-5 d-none d-md-block">Telefon: <a class="it" href="tel: 4952531717">0 52 53 / 17 17</a></p>
 </div><!-- sm-5 end -->
 <div class="col-sm-4 pt-2">
 <!-- <img class="mapicons" src="https://www.tk-aerztefuehrer.de/TK/images/GoogleImages/A.png" alt=" " /><br>  -->
 <br/>
 <img alt=" " src="https://www.tk-aerztefuehrer.de/TK/img/entfernung.svg"/>  0.2 km<br/>
 <span class="pt-3 d-none d-md-block"></span>
 Tegelhof 1<br/>
 33014 Bad Driburg<br/>
 </div><!-- sm-4 end -->
 <div class="col-sm-3">
 </div><!-- sm-3 end -->
 </div><!--   end row  -->
 

Ответ №1:

Опубликованный вами HTML-код поврежден. У вас есть html-теги внутри неполных комментариев. Все после <!— ********* является недействительным. Я не думаю, что это сработает, пока эта строка не будет удалена. Если вы запустите BeautifulSoup для этого html-блока, он не будет включать текст, который вы пытаетесь получить. Но это произойдет, если вы удалите неполный комментарий. Если у вас нет доступа для редактирования этой веб-страницы, вы можете обработать html как строку и заменить <!— ********* ни с чем, а затем ссылаться на фиксированную HTML-строку в BeautifulSoup.

Вероятно, есть лучший способ сделать это, но это позволит получить нужную информацию, обратившись к предыдущему, ближайшему тегу img и используя его в качестве привязки для поиска текста адреса.

 addressLine1 = str(soup.find('img', class_='').findNextSibling(text=True).findNextSibling(text=True).findNextSibling(text=True)).strip()
# Am Rathausplatz 4
addressLine2 = str(soup.find('img', class_='').findNextSibling(text=True).findNextSibling(text=True).findNextSibling(text=True).findNextSibling(text=True)).strip()
# 33014 Bad Driburg
 

Полный пример:

 from bs4 import BeautifulSoup

# remove <!-- *********
html = """<div class="d-none d-md-block">
 <a class="btn btn-outline-secondary arrow-r" href="https://www.tk-aerztefuehrer.de/TK/Suche_SN/index.js?a=DDamp;amp;sid=amp;amp;e_id=799433amp;amp;Db=" title="Zur Detailseite">Zur Detailseite</a>
 <!-- OTB Termin finden desktop  **** -->
 <!-- ***  -->
 </div>
 <!-- <img class="mapicons" src="https://www.tk-aerztefuehrer.de/TK/images/GoogleImages/E.png" alt=" " /><br>  -->
 <br>
 <img src="https://www.tk-aerztefuehrer.de/TK/img/entfernung.svg" alt=" " />  0.3 km<br />
 <br>

 Am Rathausplatz 4<br />
 33014 Bad Driburg<br />
 <br />"""
soup = BeautifulSoup(html, 'lxml')  # if you use html.parser the code below will be different

# find <img> element first, then get text element next to it
addressLine1 = str(soup.find('img', class_='').findNextSibling(text=True).findNextSibling(text=True).findNextSibling(text=True)).strip()
# Am Rathausplatz 4
addressLine2 = str(soup.find('img', class_='').findNextSibling(text=True).findNextSibling(text=True).findNextSibling(text=True).findNextSibling(text=True)).strip()
# 33014 Bad Driburg

print(addressLine1)
print(addressLine2)
 

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

1. Извините за это, моя ошибка, я не скопировал полный код. Теперь я обновил его. Я также попробовал приведенный выше код, указав класс, но он выдает ошибку как: raise AttributeError( 2174 "ResultSet object has no attribute '%s'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?" % key 2175 ) AttributeError: ResultSet object has no attribute 'find'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?

2. Если вы запустите код, который я опубликовал, используя python 3.x, он будет успешно запущен и выведет адрес.

3. HTML-код по-прежнему не работает. Есть комментарии и цитаты, которые не закрыты. HTML просто очень плохой из-за ошибок и не соответствует рекомендациям по удобочитаемости. Нет отступов, плохих комментариев, плохого интервала. Незакрытая цитата найдена в Db=» title =»Zur Detailseite» и незакрытый комментарий <!— ********* заставит beautifulsoup неправильно читать HTML-код.

4. Привет, я внимательно просмотрел html-код и нашел больше строк кода под предыдущим кодом, который я скопировал. Я нашел больше строк с адресом. Похоже, что в правильном формате. Не могли бы вы взглянуть на это. Если этот код поможет решить мою проблему. Заранее большое спасибо!!

5. Из приведенного выше html-кода я попытался извлечь теги br с помощью y = soup.find('div', {"class": "col-sm-4 pt-2"}) и получил результаты, приведенные ниже <div class="col-sm-4 pt-2"> <!-- <img class="mapicons" src="https://www.tk-aerztefuehrer.de/TK/images/GoogleImages/A.png" alt=" " /><br> --> <br/> <img alt=" " src="https://www.tk-aerztefuehrer.de/TK/img/entfernung.svg"/> 0.2 km<br/> <span class="pt-3 d-none d-md-block"></span> Tegelhof 1<br/> 33014 Bad Driburg<br/> </div> , но я не могу извлечь конкретно теги br.