【发布时间】:2019-04-29 16:06:29
【问题描述】:
我使用selenium 和find_element_by_xpath 从网页中提取一些文本。我已经设法在我的笔记本电脑上成功地完成了这项工作。但是,我需要在 Google Colab 中运行代码
所以我不能使用 selenium(Colab 中没有 Firefox 或 Chrome,我得到一个 geckodriver 错误,这是有道理的)。 lxml 看起来很有希望,我已经设法让它在几个值上起作用,但是
某些值不在提取的 html 中(奇怪),因此返回的字符串为空。
在其中一个 xpath 中删除“tbody”在一种情况下会有所帮助,根据这个 SO 答案:Python lxml - returns null list 但随后有几个单元格(如游戏日期)返回为空。
这适用于带有硒的笔记本电脑(来自 Firefox 的 XPATH):
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,但对某些值返回 NULL(来自 Chrome 的 XPATH)
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 吗?
【问题讨论】:
-
如果删除 tbody 有帮助,这意味着 lxml 不在 html5 模式下,而 Firefox 始终是。你可以试试 html5 解析器。
标签: python selenium xpath lxml