Как извлечь данные из выражения регулярного выражения в этом случае? - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь очистить ridernames от этого URL

В настоящее время я борюсь с моим выражением регулярного выражения, поскольку оно отлично работает при сопоставлении содержимого (regex101), однако я не уверен, как взять соответствующее выражение регулярного выражения и использовать его для извлечения значений.

Когда я очищаю, я могу изменить findall на finditer, чтобы соответствовать ему (и получить результат), но я не уверен, как я иду оттуда, и получаю его повторно, присваивая возвращаемые значения списку

# import modules
import urllib.request
import urllib.parse
import re

# fake user agent for access
user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'
headers={'User-Agent':user_agent,}

url = 'https://dataride.uci.ch/Results/iframe/RankingDetails/119?disciplineId=8&groupId=48&momentId=39994&disciplineSeasonId=139&rankingTypeId=1&categoryId=22&raceTypeId=71'
req = urllib.request.Request(url, None,headers)
resp = urllib.request.urlopen(req)
respData = resp.read()

riders = re.findall(r'(<a)\s+(href=\"/Results/iframe/RiderRankingDetails/)[0-9]+(\?rankingId=)[0-9]+(\&amp;groupId=)[0-9]+(\&amp;momentId=)[0-9]+(\&amp;baseRankingTypeId=)[0-9]+(\&amp;disciplineSeasonId=)[0-9]+(\&amp;disciplineId=)[0-9]+(\&amp;categoryId=)[0-9]+(\&amp;raceTypeId=)[0-9]+(\">)[A-Z]+\s+[A-Za-z]+(</a>),str(respData))
# The [A-Z]+\s+[A-Za-z] part contains the rider name that I wish to scrape

for name in riders:
    print(name)

[A-Z]+\s+[A-Za-z] в выражении регулярного выражения должно быть возвращено списку гонщиков, чтобы затем я мог напечатать имя каждого гонщика.

Ответы [ 3 ]

0 голосов
/ 22 апреля 2019

Понятно, что элементы, которые вы хотите захватить, генерируются динамически. Таким образом, вам нужно selenium. Из вашего описания вы хотите получить имя гонщиков. Во-первых, вы должны загрузить chromedriver , который соответствует версии вашего хрома. Тогда попробуйте этот код:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome(r'/path/chromedriver')  #refers to the path of your downloaded chromedriver

browser.get("https://dataride.uci.ch/Results/iframe/RankingDetails/119?disciplineId=8&groupId=48&momentId=39994&disciplineSeasonId=139&rankingTypeId=1&categoryId=22&raceTypeId=71")

post_elems = browser.find_elements_by_tag_name("a")

for post in post_elems[3:]:
    if post.text != '':
        print (post.text)

Выход:

CORNEGLIANI Fabrizio
BACHMAIER Ernst
JAHODA Patrik
FRÜH Benjamin
SIMEONI Manolo
TUOR Alain
UBERTI Giuseppe
GOMIERO Andrea
PANTANO Dino
0 голосов
/ 22 апреля 2019

Вы можете имитировать POST-запрос страницы, который работает быстрее, чем при использовании браузера

import requests

headers = {'User-Agent' : 'Mozilla/5.0',
           'Referer' : 'https://dataride.uci.ch/Results/iframe/RankingDetails/119?disciplineId=8&groupId=48&momentId=39994&disciplineSeasonId=139&rankingTypeId=1&categoryId=22&raceTypeId=71'}
data = {

'rankingId' : 119,
'disciplineId' : 8,
'currentRankingTypeId' : 1,
'rankingTypeId' : 1,
'take' : 40,
'skip' : 0,
'page' : 1,
'pageSize' : 40,
'filter[filters][0][field]' : 'RaceTypeId',
'filter[filters][0][value]' : 71,
'filter[filters][1][field]' : 'CategoryId',
'filter[filters][1][value]' : 22,
'filter[filters][2][field]' : 'SeasonId',
'filter[filters][2][value]' : 139,
'filter[filters][4][value]' : 0 
}
r = requests.post('https://dataride.uci.ch/Results/iframe/ObjectRankings/', headers = headers, data = data).json()   
riders = [item['DisplayName'] for item in r['data']]
print(riders)

Вывод:

enter image description here

0 голосов
/ 22 апреля 2019

Как упомянуто в комментариях @DYZ, веб-страница генерируется динамически, и при попытке загрузить ее с помощью urlib вы получите веб-страницу, подобную этой: NonSenseWebpage

, но если вызайдя на ту же самую веб-страницу через браузер, вы увидите все райдеры и ранги, потому что браузеры выполняют java-скрипты, которые загрузчики, такие как urllib или запросы, не выполняют

the webpage via browser

вам следует искать другой метод, если вам нужна информация с этого сайта, или вы можете попробовать BeautifulSoup, если вы просто хотите научиться просматривать веб-страницы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...