python - 在 svg 内的路径中查找 XPath

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

我想为我的抓取工具找到正确的 XPath

我想做的事:刮取玩家的市场值(value)。

问题:当将鼠标移到路径或俱乐部图像上时,市场值(value)仅显示在 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 呢?

我尝试了很多组合。

最佳答案

这不是一个干净的解决方案,因为我将 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 中的有效转义序列,因此您可以对其进行解析。”

关于python - 在 svg 内的路径中查找 XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54691884/

相关文章:

python - Django:向后跟踪关系

python - Mongo 条件为 "key doesn' t 存在”?

python - URL 中具有不同变量的多个 API

javascript - 需要帮助让 Hello World 应用程序工作

javascript - 使用 javascript 创建按钮并将其附加到动态 html 表格中每行的末尾

python - 初学者 : Python can't find 'pyodbc' package?

python - 使用 boost::python 公开具有 std::function 作为参数的 C++ 成员函数

javascript - 每次页面被其他人重新加载时如何打开一个新链接?

python - 为什么不过滤(不是无,可迭代)?

django - 当您将项目上传到托管服务时,mysql 如何与 django 一起工作?