Xpath с lxml возвращает пустую строку, селен работает нормально - PullRequest
0 голосов
/ 27 ноября 2018

Я использовал selenium и find_element_by_xpath для извлечения текста из веб-страниц.Мне удалось заставить это работать успешно на моем ноутбуке.Однако мне нужно запустить код в Google Colab, и поэтому я не могу использовать селен (в Colab нет Firefox или Chrome, и я получаю ошибку geckodriver, которая имеет смысл).lxml выглядит многообещающе, и мне удалось заставить его работать над парой значений, но некоторые значения просто отсутствуют в извлеченном html (странном), и поэтому возвращаемая строка пуста.

Удаление tbody в одном из xpath помогло в одном случае, согласно этому SO-ответу: Python lxml - возвращает нулевой список , но есть пара ячеек, например дата игрыкоторые возвращаются пустыми.

ЭТО РАБОТАЛО НА НОУТБУКЕ С СЕЛЕНОМ (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, НО ВОЗВРАЩАЕТ НУЛЬ ДЛЯ НЕКОТОРЫХ ЗНАЧЕНИЙ (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, чтобы предоставить то, что у меня было с селеном?

1 Ответ

0 голосов
/ 27 ноября 2018

Это потому, что в источнике страницы td с @id="utime" действительно пусто.Значение берется из переменной, объявленной в узле script, и выглядит как var game_utime = 1495375200;.Не то, чтобы это было Время эпохи , которое можно преобразовать в дата и время человека 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
...