Python中如何使用splinter模块的find_by()方法获取360搜索主页上的'搜索按钮'元素?

python 有个模块:splinter,其中有个实例方法:find_by().
怎么使用这个方法取到 https://www.so.com 网页上那个搜索按钮呢?
from splinter import Browser
browser = Browser('chrome')
ele = browser.find_by() #这句代码怎么写?
ele.click()
注:搜索按钮的源码如下: <input type="submit" id="search-button" class="skin-search-button" value="搜索">
ele = browser.find_by_id("search-button")
如上代码可以取到 ele 元素,但我想要的是:怎么使用 find_by()方法取到这个按钮元素.
多谢您回复!


Python中如何使用splinter模块的find_by()方法获取360搜索主页上的'搜索按钮'元素?

6 回复

官方文档:
Splinter provides 6 methods for finding elements in the page, one for each selector type: css, xpath, tag, name, id, value, text. Examples:

browser.find_by_css(‘h1’)
browser.find_by_xpath(’//h1’)
browser.find_by_tag(‘h1’)
browser.find_by_name(‘name’)
browser.find_by_text(‘Hello World!’)
browser.find_by_id(‘firstheader’)
browser.find_by_value(‘query’)

楼主哪里看的 find_by()方法?


from splinter import Browser

# 启动浏览器(这里以Chrome为例)
with Browser('chrome') as browser:
    # 访问360搜索主页
    browser.visit('https://www.so.com')
    
    # 方法1:通过value属性值查找(最常用)
    search_btn = browser.find_by_value('360搜索')
    
    # 方法2:通过CSS选择器查找
    search_btn = browser.find_by_css('input[type="submit"]')
    
    # 方法3:通过XPath查找
    search_btn = browser.find_by_xpath('//input[@type="submit"]')
    
    # 方法4:通过id查找(如果按钮有id)
    # search_btn = browser.find_by_id('search-button')
    
    # 使用找到的元素
    if search_btn:
        print(f"找到按钮:{search_btn.first.value}")
        # 点击按钮示例
        # search_btn.first.click()
    else:
        print("未找到搜索按钮")

# 更完整的示例,包含输入和点击操作
def search_with_splinter():
    with Browser('chrome') as browser:
        browser.visit('https://www.so.com')
        
        # 找到搜索框并输入关键词
        browser.find_by_id('q').fill('Python编程')
        
        # 找到搜索按钮并点击
        search_btn = browser.find_by_value('360搜索')
        if search_btn:
            search_btn.first.click()
            print("搜索成功执行")
            # 等待结果加载
            browser.is_element_present_by_css('.result', wait_time=5)

if __name__ == '__main__':
    search_with_splinter()

核心要点:

  1. find_by_value() 最适合这种有明确value属性的按钮
  2. 360搜索按钮的value就是“360搜索”这个文本
  3. 记得用.first获取第一个匹配元素,因为find_by返回的是元素列表

建议: 直接用find_by_value('360搜索')最稳。

#1 查看安装文件,相对地址:python-3.6.3\Lib\site-packages\splinter\driver\webdriver<a target="_blank" href=“http://init.py” rel=“nofollow noopener”>init.py
第 363 行:
def find_by(self, finder, selector, original_find=None, original_query=None):
elements = None
end_time = time.time() + self.wait_time

func_name = getattr(getattr(finder, _meth_func), _func_name)
find_by = original_find or func_name[func_name.rfind(‘by’) + 4:]
query = original_query or selector

while time.time() < end_time:
try:
elements = finder(selector)
if not isinstance(elements, list):
elements = [elements]
except NoSuchElementException:
pass

if elements:
return ElementList(
[self.element_class(element, self) for element in elements],
find_by=find_by, query=query)
return ElementList([], find_by=find_by, query=query)

#1 所说的 6 个方法 都是返回这个函数调用的…… ,既然你都懂得看源码了,那按照参数传递进去就行了。
话说为什么不直接使用人家封装好的方法呢

#3 我一瓶不满半瓶晃荡!!!
就是不知道 find_by 方法的各个参数怎么写?
所以来提问,求个实例代码的!

举个荔枝,当你调用 browser.find_by_css(‘h1’) 的时候,实际是调用 browser.find_by(driver.find_elements_by_css_selector,‘h1’,original_find=“css”,original_query=css_selector),
所以如果你打算直接用 find_by(),你要确定 selector 的类型,对照参数传入就是了。
如果说错了,望 dalao 们指正

回到顶部