gpt4 book ai didi

python - 如果第一个 XPath 匹配,如何从 bool 值 'break' XPath 中取出 "OR' ?

转载 作者:行者123 更新时间:2023-12-01 04:32:05 28 4
gpt4 key购买 nike

在Python中使用Webdriver,我正在寻找某个元素,如果没有找到,我会尝试查找通常存在的另一个元素(如果第一个元素不存在)。问题是:似乎有时会先评估第二个 XPath,当它返回有效值时,它不是我当两个元素都存在时需要的值。

driver.find_element_by_xpath("//ol/div[2]/div/div/div[2]/div[1]/div/div[3]/div/a[1]/div/div/div[2]/div/span | //ol/div[2]/div/div/div[2]/div[1]/div/div[3]/div/a[1]/div/div/div[2]/span").text

第一个 XPath 查询是我的理想场景,如果它返回有效值,我需要它突破 OR,以便第二个 XPath 不会被评估并可能返回。或者,强制它计算第一个表达式,并且仅当它不返回匹配项时才计算第二个表达式。我在这里有什么选择?

更新这就是我实际上想要做的事情:在 Google 本地搜索结果页面的左侧,例如 this ,有 20 个结果:

enter image description here

我想提取每个评论的评分(不是星级,而是评论数量),无论它是非零还是“无评论”。 问题是:在上面的 bool 值 OR Xpath 中,它有时会获取星级,而不是评论分数:

In [14]: for i in range(1,21):
....: reviews.append(driver.find_element_by_xpath("//ol/div[2]/div/div/div[2]/div[%s]/div/div[3]/div/a[1]/div/div/div[2]/div/span | //ol/div[2]/div/div/div[2]/div[%s]/div/div[3]/div/a[1]/div/div/div[2]/span" % (i,i)))

In [16]: [i.text for i in reviews]
Out[16]:
[u'5.0',
u'4 reviews',
u'4 reviews',
u'4.3',
u'2 reviews',
u'No reviews',
u'4.9',
u'3 reviews',
u'5.0',
u'2 reviews',
u'No reviews',
u'4.9',
u'4 reviews',
u'3 reviews',
u'No reviews',
u'No reviews',
u'4.9',
u'No reviews',
u'No reviews',
u'4.7']

所以我所做的就是用 try/except 替换它:

            for result in range(1,21):
try:
reviewCount = driver.find_element_by_xpath("//ol/div[2]/div/div/div[2]/div[%s]/div/div[3]/div/a[1]/div/div/div[2]/div/span" % result).text
reviewCounts.append(int(reviewCount.split()[0].replace(',','')))
except:
#reviewCount = driver.find_element_by_xpath("//ol/div[2]/div/div/div[2]/div[%s]/div/div[3]/div/a[1]/div/div/div[2]/span" % result).text
reviewCounts.append(0)
print '\t ****** Review counts for city %s : %s' % (city, reviewCounts)

但是这个操作极其慢,通常需要长达 2 分钟(确实)。

最佳答案

“|” XPath 中的运算符不是 bool OR,而是并集运算符:它形成两个节点集的并集。因此表达式的结果包含两个选择的结果。

我不知道 driver.find_element_by_xpath() 的作用,但我的猜测是它按照文档顺序获取 XPath 表达式传递的节点集中的第一个节点 - 其中可以来自联合表达式的任一操作数。

在 XPath 2.0 中解决这个问题非常容易,但我怀疑 Python 只为您提供 XPath 1.0。如果是这样的话,我怀疑最好的解决方案是 Python 中的一些条件逻辑。在伪代码中替换

find(A | B)

X = find(A)
if (X is empty) {
X = find(B)
}

我认为这大致就是你正在做的事情(我不懂Python),只不过你是通过在 X 为空时强制异常来实现的。在大多数语言中,强制异常并捕获它比使用无异常逻辑要昂贵得多。

关于python - 如果第一个 XPath 匹配,如何从 bool 值 'break' XPath 中取出 "OR' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32238598/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com