【问题标题】:extracting br tags beautiful soup python提取br标签美汤python
【发布时间】:2021-03-01 13:34:44
【问题描述】:

我是网络抓取的新手。我正在尝试从 br 标签中的以下 html 代码中提取地址文本“Tegelhof 1 33014 Bad Driburg”和“Tegelweg 2A 33014 Bad Driburg”。但我没有得到想要的结果。到目前为止,我已经使用下面的代码来获取但没有成功。有人可以帮我怎么做

代码:

address = [soup.find('div', class_='col-sm-4 pt-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  -->
<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:+4952536565">0 52 53 / 65 65</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>
        Tegelweg 2A<br/>
        33014 Bad Driburg<br/>
    </div><!-- sm-4 end -->
    <div class="col-sm-3">
    </div><!-- sm-3 end -->
</div><!--   end row  -->

【问题讨论】:

  • 我试图选择&lt;br&gt;标签,但它们的文本是empty
  • [&lt;br/&gt;, &lt;br/&gt;, &lt;br/&gt;, &lt;br/&gt;, &lt;br/&gt;, &lt;br/&gt;, &lt;br/&gt;, &lt;br/&gt;, &lt;br/&gt;, &lt;br/&gt;]
  • 你找不到这个brs的内容,因为它们不是opening,它们只是closing tags,而美汤不认为它们是标签
  • 来自w3ressource "br 元素本身不能包含任何内容。"
  • 您从代码中获得的输出是什么?它应该显示您正在搜索的文本。试试soup.find_all('div', class_='col-sm-4 pt-2')[0].text(我建议你使用find_all,它会返回每个匹配的标签,而不是只返回第一个)。

标签: python beautifulsoup


【解决方案1】:
html_doc="""<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  -->

 <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:+4952536565">0 52 53 / 65 65</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>
 Tegelweg 2A<br/>
 33014 Bad Driburg<br/>
 </div><!-- sm-4 end -->
 <div class="col-sm-3">
 </div><!-- sm-3 end -->
 </div><!--   end row  --> """
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')
address = soup.find_all('div', class_='col-sm-4 pt-2')
[i.text for i in address]

输出:

['\n\n\n  0.2 km\n\n Tegelhof 1\n 33014 Bad Driburg\n',
 '\n\n\n  0.2 km\n\n Tegelweg 2A\n 33014 Bad Driburg\n']

使用findall 代替find 获取列表并使用text 方法仅获取文本部分。

更新:

add1=[i.text.replace('\n', ' ').strip(' ')  for i in address]

使用replace\n 替换为space 并去除所有多余的空格 输出:

['0.2 km   Tegelhof 1  33014 Bad Driburg',
 '0.2 km   Tegelweg 2A  33014 Bad Driburg']

add2=[i.partition('km') for i in add1]
[[i[0]+i[1],i[2].strip(' ')] for i in add2]

输出:

[['0.2 km', 'Tegelhof 1  33014 Bad Driburg'],
 ['0.2 km', 'Tegelweg 2A  33014 Bad Driburg']]

【讨论】:

    【解决方案2】:

    我最初的解决方案是只获取地址,因为这是您所要求的,但是如果您想要两者都可以,您可以将其他文本与该文本分开:

    import re 
    from bs4 import BeautifulSoup as bs
    
    html = '''<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  -->
    
     <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:+4952536565">0 52 53 / 65 65</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>
     Tegelweg 2A<br/>
     33014 Bad Driburg<br/>
     </div><!-- sm-4 end -->
     <div class="col-sm-3">
     </div><!-- sm-3 end -->
     </div><!--   end row  -->'''
     
    soup = bs(html, 'html.parser')
    
    divs = soup.find_all('div', {'class':re.compile(r'pt-2')})
    for div in divs:
        text_list = div.text.strip().split('\n')
        km = text_list[0]
        address = ' '.join([x for x in text_list[1:] if x !='']).strip()
        print(km)
        print(address)
    

    输出:

    0.2 km
    Tegelhof 1  33014 Bad Driburg
    0.2 km
    Tegelweg 2A  33014 Bad Driburg
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多