使用Beautifulsoup,如何提取未嵌入标签的信息

时间:2018-07-31 20:45:15

标签: python beautifulsoup

我正在尝试从此页面解析一些选择信息:https://voyage.gc.ca/assistance/ambassades-consulats/acores

更具体地说,我正在尝试提取地址,该地址恰好在

之后
componentDidMount() {
    this.m1(params, function(){
        this.m2();
    });
}

function: m1(params, callback) {
    ...
    ...
    callback();
}

和电话号码,紧随其后

"<span class="ha-label">Adresse</span>"

摘自以下html摘录:

"<span class="ha-label">Téléphone</span>"

由于我要查找的内容未嵌入标签中,因此如何访问这些数据?

以防万一有助于放置一些上下文,到目前为止,这是我的代码:

<p></p><h3>Services locaux</h3><section><details class="ha-office"> <summary>Services d’urgence </summary><div class="mrgn-tp-md mrgn-bttm-md"><p>Composez le 112 pour toute aide d’urgence.</p></div></details></section><h3>Aide consulaire</h3><details class="span-3 ha-office"><summary><strong>Ponta Delgada</strong> - Consulat du Canada</summary><div><span class="ha-label">Adresse</span>Rua D’Agua, 28, 9500-040 Ponta Delgada, São Miguel, Azores, Portugal<span class="ha-label">Téléphone</span>+351 296 281 488<span class="ha-label">Télécopieur</span>+351 296 287 769<span class="ha-label">Courriel</span><a class="offices" href="mailto:canada.pdl@gmail.com">canada.pdl@gmail.com</a><span class="ha-label">Facebook</span><span class="ha-has-facebook"></span><a href="https://www.facebook.com/CanadaauPortugal/?ref=hl" target="_blank">Ambassade du Canada au Portugal</a><span class="ha-label">Heures d’ouverture :</span>Lundi au vendredi, de 9 h 00 à 12 h 30 et de 14 h à 16 h</div></details><details class="span-3 ha-office"><summary><strong>Lisbonne</strong> - Ambassade du Canada</summary><div><span class="ha-label">Adresse</span>Avenida da Liberdade 198-200, 3e étage, 1269-121, Lisbonne, Portugal<span class="ha-label">Téléphone</span>+351 21 316 4600<span class="ha-label">Télécopieur</span>+351 21 316 4693<span class="ha-label">Courriel</span><a class="offices" href="mailto:lsbon.consulaire@international.gc.ca">lsbon.consulaire@international.gc.ca</a><span class="ha-label">Internet</span><span class="ha-has-internet"></span><a href="http://www.portugal.gc.ca" target="_blank">www.portugal.gc.ca</a><span class="ha-label">Services</span><span class="ha-text ha-has-passport">Des services de passeport sont offerts</span><span class="ha-label">Facebook</span><span class="ha-has-facebook"></span><a href="https://www.facebook.com/pages/Ambassade-du-Canada-au-Portugal/771363522882326" target="_blank">Ambassade du Canada au Portugal</a></div></details><p>Pour obtenir une aide consulaire d'urgence, téléphonez à l'ambassade du Canada à Lisbonne et suivez les instructions qui vous seront données. À tout moment, vous pouvez aussi communiquer avec le <a href="http://voyage.gc.ca/assistance/assistance-d-urgence">Centre de surveillance et d'intervention d’urgence</a> à Ottawa.</p><p></p>

2 个答案:

答案 0 :(得分:1)

这将从页面上的所有“助手”获得信息:

from bs4 import BeautifulSoup, NavigableString
import requests
from pprint import pprint

r = requests.get('https://voyage.gc.ca/assistance/ambassades-consulats/acores')
soup = BeautifulSoup(r.text, 'lxml')

d = {}
for details in soup.select('details'):
    d2 = {}
    d[details.select_one('summary').text] = d2
    for label in details.select('.ha-label'):
        d2[label.text] = label.nextSibling if isinstance(label.nextSibling, NavigableString) else label.nextSibling.text
        if not d2[label.text]:
            del d2[label.text]

pprint(d)

打印:

{'Lisbonne - Ambassade du Canada': {'Adresse': 'Avenida da Liberdade 198-200, '
                                               '3e étage, 1269-121, Lisbonne, '
                                               'Portugal',
                                    'Courriel': 'lsbon.consulaire@international.gc.ca',
                                    'Services': 'Des services de passeport '
                                                'sont offerts',
                                    'Télécopieur': '+351 21 316 4693',
                                    'Téléphone': '+351 21 316 4600'},
 'Ponta Delgada - Consulat du Canada': {'Adresse': 'Rua D’Agua, 28, 9500-040 '
                                                   'Ponta Delgada, São Miguel, '
                                                   'Azores, Portugal',
                                        'Courriel': 'canada.pdl@gmail.com',
                                        'Heures d’ouverture :': 'Lundi au '
                                                                'vendredi, de '
                                                                '9 h 00 à 12 h '
                                                                '30 et de 14 h '
                                                                'à 16 h',
                                        'Télécopieur': '+351 296 287 769',
                                        'Téléphone': '+351 296 281 488'},
 'Services d’urgence ': {}}

要获取每个爱德领事的地址和电话:

for k, v in d.items():
    print(k)
    print(v.get('Adresse', '-'))
    print(v.get('Téléphone', '-'))
    print('-' * 80)

打印:

Services d’urgence 
-
-
--------------------------------------------------------------------------------
Ponta Delgada - Consulat du Canada
Rua D’Agua, 28, 9500-040 Ponta Delgada, São Miguel, Azores, Portugal
+351 296 281 488
--------------------------------------------------------------------------------
Lisbonne - Ambassade du Canada
Avenida da Liberdade 198-200, 3e étage, 1269-121, Lisbonne, Portugal
+351 21 316 4600
--------------------------------------------------------------------------------

答案 1 :(得分:0)

使用nextSibling

例如:

from bs4 import BeautifulSoup
html = """<p></p><h3>Services locaux</h3><section><details class="ha-office"> <summary>Services d’urgence </summary><div class="mrgn-tp-md mrgn-bttm-md"><p>Composez le 112 pour toute aide d’urgence.</p></div></details></section><h3>Aide consulaire</h3><details class="span-3 ha-office"><summary><strong>Ponta Delgada</strong> - Consulat du Canada</summary><div><span class="ha-label">Adresse</span>Rua D’Agua, 28, 9500-040 Ponta Delgada, São Miguel, Azores, Portugal<span class="ha-label">Téléphone</span>+351 296 281 488<span class="ha-label">Télécopieur</span>+351 296 287 769<span class="ha-label">Courriel</span><a class="offices" href="mailto:canada.pdl@gmail.com">canada.pdl@gmail.com</a><span class="ha-label">Facebook</span><span class="ha-has-facebook"></span><a href="https://www.facebook.com/CanadaauPortugal/?ref=hl" target="_blank">Ambassade du Canada au Portugal</a><span class="ha-label">Heures d’ouverture :</span>Lundi au vendredi, de 9 h 00 à 12 h 30 et de 14 h à 16 h</div></details><details class="span-3 ha-office"><summary><strong>Lisbonne</strong> - Ambassade du Canada</summary><div><span class="ha-label">Adresse</span>Avenida da Liberdade 198-200, 3e étage, 1269-121, Lisbonne, Portugal<span class="ha-label">Téléphone</span>+351 21 316 4600<span class="ha-label">Télécopieur</span>+351 21 316 4693<span class="ha-label">Courriel</span><a class="offices" href="mailto:lsbon.consulaire@international.gc.ca">lsbon.consulaire@international.gc.ca</a><span class="ha-label">Internet</span><span class="ha-has-internet"></span><a href="http://www.portugal.gc.ca" target="_blank">www.portugal.gc.ca</a><span class="ha-label">Services</span><span class="ha-text ha-has-passport">Des services de passeport sont offerts</span><span class="ha-label">Facebook</span><span class="ha-has-facebook"></span><a href="https://www.facebook.com/pages/Ambassade-du-Canada-au-Portugal/771363522882326" target="_blank">Ambassade du Canada au Portugal</a></div></details><p>Pour obtenir une aide consulaire d'urgence, téléphonez à l'ambassade du Canada à Lisbonne et suivez les instructions qui vous seront données. À tout moment, vous pouvez aussi communiquer avec le <a href="http://voyage.gc.ca/assistance/assistance-d-urgence">Centre de surveillance et d'intervention d’urgence</a> à Ottawa.</p><p></p>"""
soup = BeautifulSoup(html, "html.parser")
print(soup.find("span", text="Adresse").nextSibling)
print(soup.find("span", text="Téléphone").nextSibling)

输出:

Rua D’Agua, 28, 9500-040 Ponta Delgada, São Miguel, Azores, Portugal
+351 296 281 488