带有lxml的Xpath返回空字符串,Selenium正常运行

时间:2018-11-27 20:39:14

标签: python selenium xpath lxml

我已经使用seleniumfind_element_by_xpath从网页中提取了一些文本。我已经设法在笔记本电脑上成功运行此功能。但是,我需要在Google Colab中运行代码 因此我无法使用硒(Colab中没有Firefox或Chrome,并且出现了有意义的geckodriver错误)。 lxml看起来很有前途,我已经设法使它适用于两个价值观,但是 提取的html中没有某些值(很奇怪),因此返回的字符串为空。

根据以下SO答案:Python lxml - returns null list,将x路径中的“ tbody”拖放到一个实例中很有帮助,但是像游戏日期这样的几个单元格又恢复为空。

使用硒(XPATHS来自FIREFOX)在笔记本电脑上工作:

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的工作会为某些值(来自CHROME的XPATH)返回NULL

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提供硒所提供的吗?

1 个答案:

答案 0 :(得分:1)

那是因为页面源td中带有@id="utime"的页面实际上是空的。该值来自script节点中声明的变量,看起来像var game_utime = 1495375200;。这不是 Epoch时间,可以将其转换为人类日期和时间 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