使用Python将url作为文本获取时出现关键错误

问题描述 投票:1回答:1

我正在尝试获取数据并导出到CSV,我有主URL页面和第二个URL主页,我已导入以下这些:

from bs4 import BeautifulSoup
import urllib.request
from urllib.parse import urlparse, parse_qs
import csv

def get_page(url):
    request = urllib.request.Request(url)
    response = urllib.request.urlopen(request)
    mainpage = response.read().decode('utf-8')
    return mainpage
mainpage = get_page(www.website1.com)
mainpage_parser = BeautifulSoup(mainpage,'html.parser')
secondpage = get_page('www.website2.com')
secondpage_parser = BeautifulSoup(secondpage,'html.parser')

数据的模式是相同的,如标题,地址;因此,我使用的代码是每个类中的“find”或“find_all”;例如,

try:
    name = page_parser.find("h1",{"class":"xxx"}).find("a").get_text()
print(name)
except:
print(name)

哪个有效。但是,我无法从这个html类中的url链接获得“lat”和“lon”:

<img class="aaa" alt="map" data-track-id="static-map" width="97" height="142" src="https://www.website.com/aaaaaaa;height=284&amp;lat=18.111&amp;lon=98.111&amp;level=15&amp;returnImage=true">

我试图得到纬度和经度的代码是:

   for gps in secondpage_parser.find_all('img',{"class":"aaa"}, src=True):
      parsed_url = urlparse(gps['src'])
      mykeys = ['lat', 'lon']
      gpslocation = [parse_qs(parsed_url.query)[k][0] for k in mykeys]
   print(gpslocation)

但是对于“gpslocation = [parse_qs(parsed_url.query)[k] [0]对于my my中的k],它有关键错误”它表示“KeyError:'lat'”

我想知道这里哪个部分我有错误或者我应该如何解决它。请帮忙。

python python-3.x web-scraping beautifulsoup jupyter-notebook
1个回答
1
投票

此url没有查询字符串,但有参数(请参阅what is the difference between URL parameters and query strings)。因此,当您尝试解析查询字符串时,您会得到一个空字典。因此KeyError

"https://www.website.com/aaaaaaa;height=284&amp;lat=18.111&amp;lon=98.111&amp;level=15&amp;returnImage=true"
#                               ^--- semicolon, not question mark

print(parsed_url)的结果

ParseResult(
    scheme='https', 
    netloc='www.website.com', 
    path='/aaaaaaa',
    params='height=284&amp;lat=18.111&amp;lon=98.111&amp;level=15&amp;returnImage=true',
    query='', 
    fragment='')

这里的关键是解析参数。要修复代码,请将parsed_url.query更改为parsed_url.params

gpslocation = [parse_qs(parsed_url.params)[k][0] for k in mykeys]
© www.soinside.com 2019 - 2024. All rights reserved.