我对Python完全陌生,并且刚意识到列表理解,这给人留下了深刻的印象。我想知道是否存在类似的方法来减少以下if
语句。
if len(browser.find_elements_by_xpath('//span[@gogo-test="backers"]')) > 0:
backers = [sub for sub in browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split() if sub.isdigit()][0]
理想情况下,我想使用backers = [sub for sub in browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split() if sub.isdigit()][0]
,但是与Scrapy不同,Selenium如果找不到任何内容,则不会返回None
,并且肯定会出现{{1 }}不存在。
谢谢
答案 0 :(得分:1)
通过使用Page-Object-Model(这是一种常见的Selenium约定),您可以减少代码块:
if page.get_spans_array_size() > 0:
backers = [sub for sub in page.get_spans_array() if sub.isdigit()][0]
页面代码:
class Page:
def __init__(self, driver):
self.driver = driver
def get_spans_array_size(self):
return len(
## self.driver.find.. )
def get_spans_array(self):
return ## self.driver.find..
我的开源项目中有一个POM的python示例: https://github.com/AutomatedOwl/selenium-python-pom-example
答案 1 :(得分:0)
backers = [sub for sub in browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split() if sub.isdigit()]
backers = backers[0] if len(backers) > 0 else None
它已经很短了,几乎没有改进:)或者
backers = list(filter(lambda sub: sub.isdigit(),
browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split()
))
backers = backers[0] if len(backers) > 0 else None
或使用正则表达式:
import re
backers = browser.find_elements_by_xpath('//span[@gogo-test="backers"]')
backers = backers[0].text if len(backers) > 0 else ''
backers = re.findall('(\d+)', backers)