Получил ключевую ошибку при получении URL-адреса в виде текста с помощью Python - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь получить данные и экспортировать в 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')

Шаблоны данных - этотакие же как заголовок, адрес;таким образом, код, который я использую, - это «найти» или «найти_все» в каждом классе;например,

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

Который работал.Тем не менее, я не смог получить "lat" и "lon" из ссылки URL в этом HTML-классе:

<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] для k in mykeys]» есть ошибка «Key», в которой указано «KeyError: 'lat'»

Я хотел бы знать, какая часть здесь у меня есть ошибка или как я должен исправить это.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 13 сентября 2018

У этого URL нет строки запроса, но есть параметры (см. В чем разница между параметрами URL и строками запроса ). Поэтому, когда вы пытаетесь разобрать строку запроса, вы получаете пустой словарь. Отсюда 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...