#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.