美丽的汤选择兄弟姐妹不工作

时间:2016-03-07 19:43:51

标签: python python-3.x beautifulsoup bs4

我正在努力获得美丽的汤来返回网站上某一级代码的所有文本。但是当我尝试.contents.children.find_next_sibling中的任何一个时,它总会返回我用来过滤的标记下面的所有内容。

我正在尝试从http://www.arrondissement.com/abitibi_temiscamingue/s1-alimentation/

的下拉菜单中获取该选项

我的代码:

class get_region():
    URL = urlopen("http://www.arrondissement.com/plateau_mont_royal/s1-alimentation/")
    soup = BeautifulSoup(URL, "html.parser").find(class_="subArrow", onmouseover="dzelo.ui.openChildMenu(this)") #find(class_="dropcss3Selector")

    for string in soup.next_sibling:
        print(string.text)

我试图提取的数据来自javascript下拉菜单,也许这就是问题所在?最终目标是使用wtforms在我的应用程序中重新创建下拉菜单,因此我需要将父选项与子选项分开。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

解析下拉菜单和菜单项会有点复杂。

以下是一个示例实现:

from pprint import pprint
from urllib.request import urlopen

from bs4 import BeautifulSoup

URL = urlopen("http://www.arrondissement.com/plateau_mont_royal/s1-alimentation/")
soup = BeautifulSoup(URL, "html.parser")

data = {}
divisions = soup.select("ul[name=divisions_form] ul > li")
for division in divisions:
    data[division.a.get_text(strip=True)] = [
        subitem.a.get_text(strip=True) for subitem in division.select(".divisionDDM > li")
    ]

pprint(data)

打印:

{'Abitibi-Témiscamingue': ['Rouyn-Noranda', 'Témiscamingue', "Val-d'Or"],
 'Agglomération de Longueuil': ['Boucherville',
                                'Brossard',
                                'Greenfield Park',
                                'Longueuil',
                                'Saint-Bruno',
                                'Saint-Hubert',
                                'Saint-Lambert'],
 'Ahuntsic-Cartierville': [],
 'Alma': [],
 'Anjou': [],
 'Baie-Comeau': [],
 'Bas-Saint-Laurent': ['Rimouski', 'Rivière-du-Loup'],
 'Beaconsfield': [],
 'Beloeil': [],
 'Blainville': [],
 'Boisbriand': [],
 'Boucherville': [],
 'Brossard': [],
 'Capitale-Nationale': ['Québec'],
 'Centre-du-Québec': ['Drummondville', 'Victoriaville'],
 'Chambly': [],
 'Chaudière-Appalaches': ['Lévis', 'Saint-Georges', 'Thetford Mines'],
 'Chicoutimi': [],
 'Châteauguay': [],
 'Côte Saint-Luc': [],
 'Côte-Nord': ['Baie-Comeau', 'Sept-Îles'],
 'Côte-des-Neiges—Notre-Dame-de-Grâce': [],
 'Dollard-des-Ormeaux': [],
 'Dorval': [],
 'Drummondville': [],
 'Estrie': ['Magog', 'Sherbrooke'],
 'Gaspé': [],
 'Gaspésie-Îles-de-la-Madeleine': ['Gaspé', 'Îles-de-la-Madeleine'],
 'Gatineau': [],
 'Granby': [],
 'Greenfield Park': [],
 'Joliette': [],
 'Jonquière': [],
 'Kirkland': [],
 "L'Assomption": [],
 'La Baie': [],
 'La Prairie': [],
 'LaSalle': [],
 'Lachine': [],
 'Lanaudière': ['Joliette',
                "L'Assomption",
                'Mascouche',
                'Repentigny',
                'Terrebonne'],
 'Laurentides': ['Blainville',
                 'Boisbriand',
                 'Mirabel',
                 'Sainte-Thérèse',
                 'Saint-Eustache',
                 'Saint-Jérôme'],
 'Laval': [],
 'Le Plateau-Mont-Royal': [],
 'Le Sud-Ouest': [],
 'Longueuil': [],
 'Lévis': [],
 'L’Île-Bizard—Sainte-Geneviève': [],
 'Magog': [],
 'Mascouche': [],
 'Mauricie': ['Shawinigan', 'Trois-Rivières'],
 'Mercier—Hochelaga-Maisonneuve': [],
 'Mirabel': [],
 'Mont-Royal': [],
 'Montréal': ['Ahuntsic-Cartierville',
              'Anjou',
              'Beaconsfield',
              'Côte-des-Neiges—Notre-Dame-de-Grâce',
              'Côte Saint-Luc',
              'Dollard-des-Ormeaux',
              'Dorval',
              'L’Île-Bizard—Sainte-Geneviève',
              'Kirkland',
              'Lachine',
              'LaSalle',
              'Mercier—Hochelaga-Maisonneuve',
              'Montréal-Nord',
              'Mont-Royal',
              'Outremont',
              'Pierrefonds-Roxboro',
              'Le Plateau-Mont-Royal',
              'Pointe-Claire',
              'Rivière-des-Prairies—Pointe-aux-Trembles',
              'Rosemont—La Petite-Patrie',
              'Saint-Laurent',
              'Saint-Léonard',
              'Le Sud-Ouest',
              'Verdun',
              'Ville-Marie',
              'Villeray—Saint-Michel—Parc-Extension',
              'Westmount'],
 'Montréal-Nord': [],
 'Montérégie': ['Beloeil',
                'Chambly',
                'Châteauguay',
                'Granby',
                'La Prairie',
                'Saint-Constant',
                'Sainte-Julie',
                'Saint-Hyacinthe',
                'Saint-Jean-sur-Richelieu',
                'Salaberry-de-Valleyfield',
                'Sorel-Tracy',
                'Varennes',
                'Vaudreuil-Dorion'],
 'Nord-du-Québec': [],
 'Outaouais': ['Gatineau'],
 'Outremont': [],
 'Pierrefonds-Roxboro': [],
 'Pointe-Claire': [],
 'Québec': [],
 'Repentigny': [],
 'Rimouski': [],
 'Rivière-des-Prairies—Pointe-aux-Trembles': [],
 'Rivière-du-Loup': [],
 'Rosemont—La Petite-Patrie': [],
 'Rouyn-Noranda': [],
 'Saguenay-Lac-Saint-Jean': ['Alma', 'Chicoutimi', 'Jonquière', 'La Baie'],
 'Saint-Bruno': [],
 'Saint-Constant': [],
 'Saint-Eustache': [],
 'Saint-Georges': [],
 'Saint-Hubert': [],
 'Saint-Hyacinthe': [],
 'Saint-Jean-sur-Richelieu': [],
 'Saint-Jérôme': [],
 'Saint-Lambert': [],
 'Saint-Laurent': [],
 'Saint-Léonard': [],
 'Sainte-Julie': [],
 'Sainte-Thérèse': [],
 'Salaberry-de-Valleyfield': [],
 'Sept-Îles': [],
 'Shawinigan': [],
 'Sherbrooke': [],
 'Sorel-Tracy': [],
 'Terrebonne': [],
 'Thetford Mines': [],
 'Tout Arrondissement.com': [],
 'Trois-Rivières': [],
 'Témiscamingue': [],
 "Val-d'Or": [],
 'Varennes': [],
 'Vaudreuil-Dorion': [],
 'Verdun': [],
 'Victoriaville': [],
 'Ville-Marie': [],
 'Villeray—Saint-Michel—Parc-Extension': [],
 'Westmount': [],
 'Îles-de-la-Madeleine': []}