【问题标题】:Finding XPath in a path inside svg在 svg 内的路径中查找 XPath
【发布时间】:2019-02-14 13:44:57
【问题描述】:

我想为我的爬虫找到正确的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 中的俱乐部图像上,它会返回正确的数据。

那么,我如何在此处为move_to_element_by_xpath 找到正确的xpath

我尝试了很多组合。

【问题讨论】:

  • 好吧,我的计划是把它们都刮掉。稍后我将构建循环。我现在的问题是我什至不能得到一个回报。
  • 啊....谢谢..回答了我的问题

标签: python html python-3.x xpath web-scraping


【解决方案1】:

这不是一个干净的解决方案,因为我将 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 作为转义序列,其中 AB 是引用字符的十六进制数。另一个有效的转义序列是 \uABCD,其中 ABCD 作为十六进制数。通常,\xAB 等价于 \ u00AB 因为这就是 Unicode 代码点的制作方式。所以你可以从一个转换到另一个。 由于 \uABCD 是 JSON 中的有效转义序列,因此您可以对其进行解析。”

【讨论】:

    【解决方案2】:

    所以,我可以收集到的是 tooltip 正在从 https://www.transfermarkt.de/fc-bayern-munchen/startseite/verein/27 获取数据,所以从这个链接中抓取数据。

    因为,没有任何tooltips 的数据是可用的,您可以在该网页上轻松找到他们的xpath

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2015-04-22
      • 1970-01-01
      • 2015-10-01
      相关资源
      最近更新 更多