带有 lxml returns 空字符串的 Xpath,selenium 工作正常

Xpath with lxml returns empty string, selenium works ok

我已经使用 seleniumfind_element_by_xpath 从网页中提取了一些文本。我已经设法让这个在我的笔记本电脑上成功运行。但是,我需要 运行 Google Colab 中的代码 所以我不能使用 selenium(在 Colab 中没有 Firefox 或 Chrome,我得到了一个 geckodriver 错误,这是有道理的)。 lxml 看起来很有前途,我已经设法让它在几个值上工作,但是 某些值不在提取的 html 中(奇怪),因此返回的字符串为空。

在一个 xpath 中删除 'tbody' 在一个实例中有所帮助,根据这个 SO 答案:Python lxml - returns null list 但随后有几个像游戏日期这样的单元格返回为空。

这适用于带有 SELENIUM 的笔记本电脑(来自 FIREFOX 的 XPATHS):

from selenium import webdriver

URL = 'https://www.soccer24.com/match/C4RB2hO0/#match-summary'

browser = webdriver.Firefox()
browser.get(URL)

Selenium_TeamA_working = browser.find_element_by_xpath('/html/body/div[1]/div[1]/div[2]/table/tbody/tr/td[2]/table/tbody/tr[1]/td[1]/span/a').text
print('Team A using selenium: ' + Selenium_TeamA_working)           

这种方法适用于 LXML,但 RETURNS 某些值为空(来自 CHROME 的 XPATHS)

import requests
from lxml import html

pageContent=requests.get(URL)
tree = html.fromstring(pageContent.content)
print(pageContent.content) #just to check the html string

TeamA_broken = tree.xpath('//*[@id="flashscore_column"]/table/tbody/tr[1]/td[1]/span/a/text()') #get Team A: this does not work
print('Team A using lxml (empty): ' + TeamA_broken) #output []
TeamA_working = tree.xpath('//*[@id="flashscore_column"]/table/tr[1]/td[1]/span/a/text()') #get Team A: drop tbody and then it works
print('Team A using lxml (working): ' + TeamA_working) #output ['Hull']
Date_notworking = tree.xpath('//*[@id="utime"]/text()') #this does not work and the game date is empty in the html
print('Game date using lxml (empty): ' + Date_notworking) #output []

我可以获取 lxml 来提供我拥有的 selenium 吗?

那是因为在页面源 td@id="utime" 中确实是空的。该值来自 script 节点中声明的变量,看起来像 var game_utime = 1495375200;。并不是说这是 Epoch time 可以转换为 human date&time May 21, 2017 5:00:00 PM.

您可以使用正则表达式解析script节点并提取纪元时间,然后将其转换为所需格式,如下所示

import time
import requests
from lxml import html
import re

pageContent = requests.get(URL).text

epoch_time =  re.search('var game_utime = (\d+);', pageContent).group(1)
date = time.strftime('%d-%m-%Y %H:%M', time.localtime(int(epoch_time)))
print(date)
#  21-05-2017 17:00