带有 lxml returns 空字符串的 Xpath,selenium 工作正常
Xpath with lxml returns empty string, selenium works ok
我已经使用 selenium
和 find_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
我已经使用 selenium
和 find_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