gpt4 book ai didi

python - 网络数据(wiki) 抓取 python

转载 作者:太空宇宙 更新时间:2023-11-03 17:14:09 25 4
gpt4 key购买 nike

我正在尝试从维基百科获取某所大学的 lat lng,我有一个基本 url= ' https://de.wikipedia.org/wiki/Liste_altsprachlicher_Gymnasien ' 与大学列表,我从 href 获取每所大学的 wiki 页面,以获取他们的 wiki 页面上的 lat lng。我收到此错误“NoneType”对象没有属性“文本””我无法纠正此错误,我在哪里做错了?

import time
import csv
from bs4 import BeautifulSoup
import re
import requests
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://de.wikipedia.org/wiki/Liste_altsprachlicher_Gymnasien')
html = driver.page_source
base_url = 'https://de.wikipedia.org'
url = 'https://de.wikipedia.org/wiki/Liste_altsprachlicher_Gymnasien'
res = requests.get(url)
soup = BeautifulSoup(res.text)

university = []
while True:
res = requests.get(url)
soup = BeautifulSoup(res.text)
links = soup.find_all('a', href=re.compile('.*\/wiki\/.*'))
for l in links:
full_link = base_url + l['href']
town = l['title']
res = requests.get(full_link)
soup = BeautifulSoup(res.text)
info = soup.find('span', attrs={"title":["Breitengrad","Längengrad"]})
latlong = info.text
university.append(dict(town_name=town, lat_long=latlong))
print(university)

编辑 1感谢@rll,我进行了编辑:

if info is not None:
latlong = info.text
university.append(dict(town_name=town, postal_code=latlong))
print(university)

现在代码可以工作,但我只看到纬度,但看不到经度

示例输出:{'postal_code': '49°\xa072\xa036,73\xa0N', 'town_name': 'Schönborn-Gymnasium Bruchsal'}, {'postal_code': '49°\xa072\xa030,73\xa0N', 'town_name': '圣。保卢斯海姆'}无论如何,如何格式化此输出以获取经度,并格式化输出抱歉,我在正则表达式方面很差。

编辑2

我还用更新的代码来获取经度

info = soup.find('span', attrs={"title":"Breitengrad"})
info1 = soup.find('span',attrs={"title":"Längengrad"})
if info is not None:
latlong = info.text
longitude = info1.text
university.append(dict(town_name=town, postal_code=latlong,postal_code1=longitude))
print(university)

现在我的输出如下:

{'postal_code': '48°\xa045′\xa046,9″\xa0N',
'postal_code1': '8°\xa014′\xa044,8″\xa0O',
'town_name': 'Gymnasium Hohenbaden'},

所以我需要帮助格式化纬度和经度,因为我无法弄清楚如何转换,例如:48°\xa045′\xa046,9″\xa0N 到 48° 45′ 9″ N 谢谢

最佳答案

抱歉没有直接回答,但我总是更喜欢使用 MediaWiki 的 API。我们很幸运拥有mwclient在 Python 中,这使得使用 API 变得更加容易。

因此,就其值(value)而言,我将如何使用 mwclient 来做到这一点:

import re
import mwclient

site = mwclient.Site('de.wikipedia.org')
start_page = site.Pages['Liste_altsprachlicher_Gymnasien']

results = {}
for link in start_page.links():
page = site.Pages[link['title']]
text = page.text()

try:
pattern = re.compile(r'Breitengrad.+?([0-9]+/[0-9]+/[\.0-9]+)/N')
breiten = [float(b) for b in pattern.search(text).group(1).split('/')]

pattern = re.compile(r'Längengrad.+?([0-9]+/[0-9]+/[\.0-9]+)/E')
langen = [float(b) for b in pattern.search(text).group(1).split('/')]
except:
continue

results[link['title']] = breiten, langen

这为成功找到坐标的每个链接提供了一个列表元组[deg, min, sec]:

>>> results

{'Akademisches Gymnasium (Wien)': ([48.0, 12.0, 5.0], [16.0, 22.0, 34.0]),
'Akademisches Gymnasium Salzburg': ([47.0, 47.0, 39.9], [13.0, 2.0, 2.9]),
'Albertus-Magnus-Gymnasium (Friesoythe)': ([53.0, 1.0, 19.13], [7.0, 51.0, 46.44]),
'Albertus-Magnus-Gymnasium Regensburg': ([49.0, 1.0, 23.95], [12.0, 4.0, 32.88]),
'Albertus-Magnus-Gymnasium Viersen-Dülken': ([51.0, 14.0, 46.29], [6.0, 19.0, 42.1]),
...
}

您可以按照自己喜欢的方式设置格式:

for uni, location in results.items():
lat, lon = location
string = """University {} is at {}˚{}'{}"N, {}˚{}'{}"E"""
print(string.format(uni, *lat+lon))

或者将 DMS 坐标转换为十进制:

def dms_to_dec(coord):
d, m, s = coord
return d + m/60 + s/(60*60)

decimal = {uni: (dms_to_dec(b), dms_to_dec(l)) for uni, (b, l) in results.items()}

请注意,并非所有链接页面都可能是大学;我没有仔细检查。

关于python - 网络数据(wiki) 抓取 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33807203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com