Нахождение XPath в пути внутри SVG - PullRequest
0 голосов
/ 14 февраля 2019

Я хотел бы найти правильный XPath для моего скребка.

Что я пытаюсь сделать: очистить рыночную стоимость игрока.

Проблема: рыночная стоимость отображается только в HTML при наведении курсора мыши на дорожку или изображения клуба. Я не знаю точно.

Код:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

url = 'https://www.transfermarkt.de/manuel-neuer/marktwertverlauf/spieler/17259'

driver = webdriver.Chrome()
driver.implicitly_wait(30)
driver.get(url)
time.sleep(5)

actions = ActionChains(driver)
actions.move_to_element_by_xpath('//*[@id="highcharts-0"]/div/span')
actions.move_to_element_by_xpath('//*[@id="highcharts-0"]/svg/g[5]/g[1]/path[1]')
actions.move_to_element_by_xpath('//*[@id="highcharts-0"]/svg/g[5]/g[2]/image[33]')
actions.perform()

date = driver.find_element_by_xpath('//*[@id="highcharts-0"]/div/span/b[1]').text
value = driver.find_element_by_xpath('//*[@id="highcharts-0"]/div/span/b[2]').text
club = driver.find_element_by_xpath('//*[@id="highcharts-0"]/div/span/b[3]').text
age = driver.find_element_by_xpath('//*[@id="highcharts-0"]/div/span/b[4]').text

print(date, value, club, age)

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

ЕслиЯ вручную перемещаю мышь над клубными изображениями в svg, он возвращает правильные данные.

Итак, как мне найти правильный xpath для move_to_element_by_xpath здесь?

Я пробовал так много комбинаций.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Это не чистое решение, так как я рассматриваю объект javascript, как если бы он мог быть преобразован в допустимый JSON.Я извлекаю из тега сценария, где генерируются значения.Есть некоторые проблемы с кодировкой, которые необходимо решить, с которыми @poke помог.

import requests
from bs4 import BeautifulSoup as bs
import json

url = 'https://www.transfermarkt.de/manuel-neuer/marktwertverlauf/spieler/17259'
headers = {'Host' : 'www.transfermarkt.de',
'Referer' : 'https://www.transfermarkt.de/manuel-neuer/marktwertverlauf/spieler/17259',
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
res = requests.get(url, headers = headers)
soup = bs(res.content,'lxml')
scripts = soup.select('script[type="text/javascript"]')
script = [script.text for script in scripts if 'CDATA' in script.text]


if len(script) > 0:
    s = script[1].split("'series':")[1].split(",'credits'")[0].replace("'",'"')
    data = json.loads(s.replace('\\x', '\\u00'))
    for item in data[0]['data']:
        print('Team: ' + item['verein'])
        print('Age: ' + str(item['age']))
        print('Date: ' + str(item['datum_mw']))
        print('Value' + str(item['y']))

Как мне объяснил @poke:

"Код использует \ xAB в качестве escape-последовательностей.где AB - шестнадцатеричное число, которое ссылается на символ. Другой допустимой escape-последовательностью является \ uABCD с ABCD в качестве шестнадцатеричного числа. В общем, \ xAB эквивалентен \ u00AB, поскольку именно так создаются кодовые точки Unicode. Таким образом, вы можете преобразовать изодин за другим. И поскольку \ uABCD являются допустимыми escape-последовательностями в JSON, вы можете проанализировать это. "

0 голосов
/ 14 февраля 2019

Итак, что я могу получить, так это то, что tooltip получает данные от https://www.transfermarkt.de/fc-bayern-munchen/startseite/verein/27 здесь, поэтому собирайте данные по этой ссылке.

Поскольку данные доступны без tooltips, и вы можете легконайдите их xpath на этой веб-странице.

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