真的需要这个社区的帮助!
当我尝试从旅游网站中删除动态内容时,只有点击“查看价格”时才能获得价格和相关供应商信息。网站上的按钮。所以我正在考虑使用' for loop'点击查看所有价格'查看价格'在我使用Selenium进行刮擦之前按钮。
问题是每个按钮都可以点击browser.find_element_by_xpath().click()
,但当我创建一个包含所有按钮信息的列表时,会弹出一个错误:
代码块:
browser=webdriver.Chrome("C:/Users/Owner/Downloads/chromedriver_win32/chromedriver.exe")
url="https://www.cruisecritic.com/cruiseto/cruiseitineraries.cfm?port=122"
browser.get(url)
#print(browser.find_element_by_css_selector(".has-price.meta-link.show-column").text)
ButtonList=[ "//div[@id='find-a-cruise-full-results-container']/div/article/ul/li[3]/span[2]",
"//div[@id='find-a-cruise-full-results-container']/div/article[2]/ul/li[3]/span[2]",
"//div[@id='find-a-cruise-full-results-container']/div/article[3]/ul/li[3]/span[2]"]
for button in ButtonList:
browser.implicitly_wait(20)
browser.find_element_by_xpath(str(button)).click()
错误堆栈跟踪:
WebDriverException: unknown error: Element <span class="label hidden-xs-down" data-title="...">View All Prices</span> is not clickable at point (862, 12). Other element would receive the click: <a href="https://boards.cruisecritic.com" onclick="s_objectID='Primary Nav : Boards';">...</a>
(Session info: chrome=63.0.3239.132)
(Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 10.0.16299 x86_64)
我的问题是如何在抓取之前点击网页上的所有按钮,或者如果我们必须点击某个按钮来解析和删除网页上的动态内容#39;将数据导入Python。附图是网页截图。
真的很感谢社区的帮助! enter image description here
答案 0 :(得分:2)
您可能需要为您正在使用的Xpath寻找相对路径。 可能是在您执行数据时显示的数据仅部分存在的情况。
尝试的方法:
您需要在进行调用时检查DOM元素中是否存在数据。如果是这种情况,等到加载整个页面将帮助你。
答案 1 :(得分:1)
Hello使用以下代码点击每个价格按钮,如果需要,也可以引入隐式等待。
for one_row_view_price in browser.find_elements_by_xpath('//span[@data-title="View All Prices"]'):
one_row_view_price.click()
如果您的BOT能够点击价格按钮
,请告诉我由于
快乐编码
答案 2 :(得分:1)
以下是根据您的要求设计的功能:
def click_handler(xpath):
# Find total number of element available on webpage
xpath = re.sub('"', "'", xpath)
total_element = browser.execute_script("""
var elements = document.evaluate("%s",
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null);
return elements.snapshotLength;
""" %xpath
)
# Check if there is any element
if(total_element):
# Iterate over all found elements
for element_pos in range(total_element):
# Call click element function
browser.execute_script("""
var elements = document.evaluate("%s",
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null);
var im = elements.snapshotItem(%d);
im.click();
""" %(xpath, element_pos)
)
print "***" + str(element_pos + 1) + " Elements clicked"
print "\n****************************"
print "Total " + str(total_element) + " Elements clicked"
print "****************************\n"
# Inform user that there is no element found on webpage
else:
print "\n****************************"
print "Element not found on Webpage"
print "****************************\n"
# Element not found on Webpage
click_handler('//span[@data-title="View All Prices"]')