如果你想用一个“magic xpath”选择目标节点,这里是:
from selenium import webdriver
country = 'South Africa'
driver = webdriver.Chrome()
driver.get("https://www.punters.com.au/form-guide/2020-01-14/")
xpath = f"//tr[preceding-sibling::tr[contains(@class, 'upcoming-race__row--country')]/td/img[@title='{country}']][position()<=(count(//tr[preceding-sibling::tr[contains(@class, 'upcoming-race__row--country')]/td/img[@title='{country}']])-count(//tr[preceding-sibling::tr[preceding-sibling::tr[contains(@class, 'upcoming-race__row--country')]/td/img[@title='{country}'] and contains(@class, 'upcoming-race__row--country')][1]])-count(//tr[preceding-sibling::tr[contains(@class, 'upcoming-race__row--country')]/td/img[@title='{country}'] and contains(@class, 'upcoming-race__row--country')][1]))]/td[1]"
found_nodes = driver.find_elements_by_xpath(xpath)
driver.close()
让我们以新西兰为例来描述这个 XPath 的作用:
我将为 XPath 块起别名,以便在最后更好地阅读结果的概念。
1.第一部分是关于寻找从哪里开始 - 让我们找到带有新西兰标头的节点(我们将其别名为 TARGET_XPATH):
`//tr[preceding-sibling::tr[contains(@class, 'upcoming-race__row--country')]/td/img[@title='New Zealand']]`
2. 现在我们需要将找到的结果限制在单个国家/地区。
在我知道的当前情况下,此操作的最佳选择 - “位置”运算符。
我们必须在结果中提供最后一个有用元素的位置(在第一个“垃圾”之前)。让我们计算一下:
`(count(//tr[preceding-sibling::tr[contains(@class, 'upcoming-race__row--country')]/td/img[@title='New Zealand']])-count(//tr[preceding-sibling::tr[preceding-sibling::tr[contains(@class, 'upcoming-race__row--country')]/td/img[@title='New Zealand'] and contains(@class, 'upcoming-race__row--country')][1]])-count(//tr[preceding-sibling::tr[contains(@class, 'upcoming-race__row--country')]/td/img[@title='New Zealand'] and contains(@class, 'upcoming-race__row--country')][1]))`
这里我们统计了三种元素:
一个。我们国家头节点之后的节点数(命名为COUNT_TOTALS):
count(//tr[preceding-sibling::tr[contains(@class, 'upcoming-race__row--country')]/td/img[@title='New Zealand']])
b.第一个“垃圾”节点之后的节点数(命名为 COUNT_AFTER_TRASHY_HEADER):
count(//tr[preceding-sibling::tr[preceding-sibling::tr[contains(@class, 'upcoming-race__row--country')]/td/img[@title='New Zealand'] and contains(@class, 'upcoming-race__row--country')][1]])
c。我们必须检查任何“垃圾”节点,以防我们在表中搜索最后一个国家的比赛 - 它不会有下一个“垃圾”节点(命名为 COUNT_TRASHY_HEADER):
count(//tr[preceding-sibling::tr[contains(@class, 'upcoming-race__row--country')]/td/img[@title='New Zealand'] and contains(@class, 'upcoming-race__row--country')][1])
3. 使用我们的计数作为过滤器:
TARGET_XPATH[position()<=(COUNT_TOTALS - COUNT_AFTER_TRASHY_HEADER - COUNT_TRASHY_HEADER)]