我正试图从网页上抓取一些文字。在我的网页上有一个显示的单词列表。当我点击“+更多”时,其中一些是可见的。单击后,单词列表始终相同(相同的单词相同的单词)。但是,其中一些是粗体的,有些是删除的。所以基本上每个数据库项都有一些功能。我想做什么:每个项目告诉我哪些功能可用,哪些功能不可用。我的问题是克服“+更多”按钮。
我的脚本仅适用于显示的单词,而不适用于“+更多”隐藏的单词。我想要做的是收集节点“del”下面的所有单词。我最初认为通过lxml,网页将被加载,因为它出现在chrome inspect元素中,我相应地编写了我的代码:
from lxml import html
tree = html.fromstring(br.open(current_url).get_data())
mydata={}
if len(tree.xpath('//del[text()='some text']')) > 0:
mydata['some text'] = 'text is deleted from the web page!'
else:
mydata['some text'] = 'text is not deleted'
每次运行此代码时,我可以收集的内容实际上是网页上显示的数据的一部分,而不是单击“+更多”后显示的完整单词列表。
我曾尝试过selenium,但据我所知,它不是用于解析而是用于与网页交互。但是如果我跑了这个:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.mywebpage.co.uk')
a = driver.find_element_by_xpath('//del[text()="some text"]')
我得到的元素或错误。我想得到一个空列表,所以我可以这样做:
mydata = {}
if len(driver.find_element_by_xpath('//del[text()="some text"]')) > 0:
mydata['some text'] = 'text is deleted from the web page!'
else:
mydata['some text'] = 'text is not deleted'
或找到另一种方法来获取脚本捕获的这些“隐藏”元素。
我的问题是有没有人遇到过这类问题?他们是如何整理出来的?
答案 0 :(得分:1)
如果我理解正确,你想在列表中找到元素。但是,如果元素在页面上不可用而不是返回列表,则Selenium会抛出ElementNotFoundException。
我的问题是你为什么要一份清单?根据您的示例判断,您希望查看页面上是否存在元素。您可以使用try / except来轻松实现此目的。
from selenium.common.exceptions import TimeoutException
try:
driver.find_element_by_xpath('//del[text()="some text"]')
mydata['some text'] = 'text is deleted from the web page!'
except TimeOutException:
mydata['some text'] = 'text is not deleted'
现在,如果你真的需要这个列表,你可以在页面中搜索多个元素。这将返回列表中与定位符匹配的所有元素。 要做到这一点,请替换:
driver.find_element_by_xpath('//del[text()="some text"]')
使用(元素 s ):
driver.find_elements_by_xpath('//del[text()="some text"]')