美汤select兄妹不工作
Beautiful soup select siblings not working
我正在尝试为 return 网站上某一层代码中的所有文本添加漂亮的汤。但是当我尝试 .contents
、.children
、.find_next_sibling
中的任何一个时,它总是 return 过滤我用来过滤的标签下的所有内容。
我正在尝试从下拉菜单中获取选项: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 在我的应用程序中重新创建下拉菜单,因此我需要将父选项与子选项分开。感谢您的帮助!
解析下拉菜单和菜单项有点复杂。
这是一个示例实现:
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': []}
我正在尝试为 return 网站上某一层代码中的所有文本添加漂亮的汤。但是当我尝试 .contents
、.children
、.find_next_sibling
中的任何一个时,它总是 return 过滤我用来过滤的标签下的所有内容。
我正在尝试从下拉菜单中获取选项: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 在我的应用程序中重新创建下拉菜单,因此我需要将父选项与子选项分开。感谢您的帮助!
解析下拉菜单和菜单项有点复杂。
这是一个示例实现:
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': []}