Selenium Tips:CSS选择器

本文介绍了Selenium中CSS选择器的使用技巧,包括直接孩子、子或子、ID、类等基础选择方式,以及下一个兄弟姐妹、属性值、选择特定匹配等高级用法,还提及了子串匹配和按内部文本匹配。此外,介绍了Sauce Labs云上的Selenium测试平台。

Selenium Tips:CSS选择器

 

CSS Selector是元素选择器和标识网页中Web元素的值的组合。  它们是HTML标记,属性,Id和类的字符串表示。  因此,它们是与树中的元素匹配的模式,并且是可用于在XML文档中选择节点的若干技术之一。 

直接孩子(子类)

XPATH中的直接子节点是使用“/”定义的,而在CSS上,它是使用“>”定义的

例子:

<span style="color:#444444">XPath:// div / a 

CSS:div  >  a
</span>

子或子

如果一个元素可能在另一个元素或一个元素内部,则它在XPATH中使用“//”定义,而在CSS中仅使用空格定义。

例子:

<span style="color:#444444">XPath:// div // 

CSS:div  a
</span>

ID

XPATH中的元素id使用以下内容定义:“[@id='example']”并在CSS中使用:“#” - ID's must be unique within the DOM.

例子:

<span style="color:#444444">XPath:// div [ @id = <span style="color:#880000">'example'</span> ]

CSS:#example
</span>

对于类,XPATH中的东西非常相似:“[@class='example']”而在CSS中它只是“。”

例子:

<span style="color:#444444">XPath:// div [ @class = <span style="color:#880000">'example'</span> ]

CSS :. 例
</span>

二:先进

下一个兄弟姐妹

这对于导航元素列表(例如表单或ul项)非常有用。下一个兄弟将告诉selenium找到页面中位于同一父节点内的下一个相邻元素。让我们看一个使用表单选择用户名后字段的示例。

<form class =  “form-signin” role =  “form” action =  “/ index.php” method =  “post” >
<h4 class =  “form-signin-heading” > < / h4>
<input type =  “text” class =  “form-control” id =  “username” name =  “username” placeholder =  “username” required autofocus> < / br>
<input type =  “password” class =  “form-control” id =  “password” name =  “password” placeholder =  “password” required>
<P> 
<button class =  “btn btn-lg btn-primary btn-block radius” type =  “submit” name =  “login” > Login < / button>
< / form> 

让我们编写一个XPath和css选择器,它将在“username”之后选择输入字段。这将选择“别名”输入,或者如果重新排序表单将选择不同的元素。

<span style="color:#444444">XPATH://输入[@ id ='username'] / follow-sibling :: input [1]
 CSS:#username  +  input
</span>

属性值

如果您不关心子元素的排序,可以使用selenium中的属性选择器根据任何属性值选择元素。一个很好的例子是选择上面表单的'username'元素而不添加类。

我们可以轻松选择username元素,而无需向元素添加类或id。

<span style="color:#444444">XPATH://输入[ @name = <span style="color:#880000">'username'</span> ] 
CSS:输入[ name = <span style="color:#880000">'username'</span> ]
</span>

我们甚至可以使用我们的选择器来链接过滤器。

<span style="color:#444444">XPATH:// 输入[ @name = 'login'和@type = 'submit' ]
 CSS:输入[ name = 'login' ] [ type = 'submit' ]</span>

这里Selenium将在输入字段上执行name =“login”和type =“submit”

选择特定的比赛

Selenium中的CSS选择器允许我们使用上述方法更加精确地导航列表。如果我们有一个ul并且我们想要选择它的第四个li元素而不考虑任何其他元素,我们应该使用nth-child或nth-of-type。

<ul id = “recordlist” >

<LI>猫</ LI>

<LI>狗</ LI>

<LI>汽车</ LI>

<LI>山羊</ LI>

</ UL>

如果我们想在这个列表中选择第四个li元素(Goat),我们可以使用nth-of-type,它将在列表中找到第四个li。

<span style="color:#444444"><span style="color:#888888">CSS:#recordlist li:nth-​​of-type(4)</span>
</span>

另一方面,如果我们想要仅在它是li元素时获得第四个元素,我们可以使用过滤的第n个子元素,在这种情况下将选择(Car)。

<span style="color:#444444"><span style="color:#888888">CSS:</span><span style="color:#888888"> #recordlist li:nth-​​child(4)</span>
</span>

请注意,如果您没有为nth-child指定子类型,则允许您选择第四个子节点而不考虑类型。这在测试selenium中的css布局时可能很有用。

<span style="color:#444444"><span style="color:#888888">CSS:</span><span style="color:#888888"> #recordlist *:nth-​​child(4)</span>
</span>

子串匹配

Selenium中的CSS有一个有趣的功能,允许使用^ =,$ =或* =进行部分字符串匹配。我将定义它们,然后显示每个示例:

^ =匹配前缀

<span style="color:#444444">CSS:a [ id ^ = <span style="color:#880000">'id_prefix_'</span> ]
</span>

带有“id”的链接,以“id_prefix_”文本开头

$ =匹配后缀

<span style="color:#444444">CSS:a [ id $ = <span style="color:#880000">'_ id_sufix'</span> ]
</span>

带有“id”的链接,以“_id_sufix”结尾

* =匹配子字符串

<span style="color:#444444">CSS:a [ id * = <span style="color:#880000">'id_pattern'</span> ]
</span>

带有“id”的链接,其中包含文本“id_pattern”

按内部文本匹配

最后,一个更有用的伪类,:contains()将匹配具有所需文本块的元素:

<span style="color:#444444">CSS:a:包含(<span style="color:#880000">'注销'</span>)
</span>

这将在您的页面上找到注销按钮,无论它位于何处。这是我最喜欢的CSS选择器,我发现它大大简化了我的很多测试代码。

Sauce Labs - 云上的Selenium测试

Sauce Labs使自动化测试变得非常棒。我们基于云的平台可帮助开发人员在900多种浏览器/操作系统平台上测试本机和混合移动和Web应用程序,包括iOS,Android和Mac OS X.Sauce支持Selenium,Appium和流行的JavaScript单元测试框架,并与所有顶级编程语言,测试框架和CI系统。通过内置的视频录制和每个测试用例的屏幕截图,调试工具以及用于本地或防火墙测试的安全隧道,Sauce可以快速,轻松地运行,调试和扩展测试套件。 


分享此文章

免费试用

 

import requests # 发送网络请求,获取 HTML 等信息 from bs4 import BeautifulSoup # 解析 HTML 信息,提取需要的信息 import time # 控制爬虫速度,防止过快被封IP headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36" # 添加浏览器头部信息,模拟请求 } def get_info(url): # 参数 url :要爬取的网页地址 web_data = requests.get(url, headers=headers) # 发送网络请求,获取 HTML 等信息 soup = BeautifulSoup(web_data.text, 'lxml') # 解析 HTML 信息,提取需要的信息 # 通过 CSS 选择器定位到需要的信息 ranks = soup.select('span.pc_temp_num') titles = soup.select('div.pc_temp_songlist > ul > li > a') times = soup.select('span.pc_temp_tips_r > span') # for 循环遍历每个信息,并将其存储到字典中 for rank, title, time in zip(ranks, titles, times): data = { "rank": rank.get_text().strip(), # 歌曲排名 "singer": title.get_text().replace("\n", "").replace("\t", "").split('-')[1], # 歌手名 "song": title.get_text().replace("\n", "").replace("\t", "").split('-')[0], # 歌曲名 "time": time.get_text().strip() # 歌曲时长 } print(data) # 打印获取到的信息 if __name__ == '__main__': urls = ["https://www.kugou.com/yy/rank/home/{}-8888.html".format(str(i)) for i in range(1, 24)] # 构造要爬取的页面地址列表 for url in urls: get_info(url) # 调用函数,获取页面信息 time.sleep(1) 扩展到一千条数据,并存到CSV文件中
最新发布
06-23
### 如何修改爬虫代码以抓取1000条数据并保存为CSV文件 为了扩展爬虫代码以获取1000条数据并存储到CSV文件中,需要对以下几个方面进行调整和优化: #### 1. **增加分页处理逻辑** 如果目标网站的数据分布在多个页面上,则需要实现分页逻辑。通常,分页可以通过以下方式实现: - 检查页面是否存在“下一页”按钮或链接。 - 提取分页的URL模式,并根据模式构造新的请求。 例如,假设分页链接的格式为 `https://example.com/page=<page_number>`,可以使用循环来动态生成请求地址[^3]。 ```python import requests from bs4 import BeautifulSoup import csv def scrape_data(base_url, total_pages): all_data = [] for page in range(1, total_pages + 1): url = f"{base_url}/page={page}" response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 假设每页的数据在特定的标签中 items = soup.find_all('div', class_='item-class') for item in items: data = extract_data(item) # 自定义函数提取单个数据项 all_data.append(data) return all_data ``` #### 2. **确保数据提取的完整性** 在提取数据时,需要明确每个字段的位置和格式。可以使用 BeautifulSoup 或 Selenium 等工具解析网页内容。例如,假设需要提取标题和描述: ```python def extract_data(item): title = item.find('h2').text.strip() description = item.find('p', class_='description').text.strip() return {'title': title, 'description': description} ``` #### 3. **将数据保存为CSV文件** 当数据收集完成后,可以使用 Python 的 `csv` 模块将其保存为 CSV 文件。以下是示例代码: ```python def save_to_csv(data, filename): keys = data[0].keys() if data else [] with open(filename, 'w', newline='', encoding='utf-8') as output_file: dict_writer = csv.DictWriter(output_file, fieldnames=keys) dict_writer.writeheader() dict_writer.writerows(data) # 调用函数 base_url = "https://example.com" total_pages = calculate_pages_for_1000_items() # 自定义函数计算需要的页数 data = scrape_data(base_url, total_pages) save_to_csv(data, 'output.csv') ``` #### 4. **控制爬取数量** 为了确保只抓取1000条数据,可以在循环中加入计数器,并在达到目标数量后停止爬取。 ```python def scrape_data_with_limit(base_url, limit): all_data = [] page = 1 while len(all_data) < limit: url = f"{base_url}/page={page}" response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') items = soup.find_all('div', class_='item-class') for item in items: if len(all_data) >= limit: break data = extract_data(item) all_data.append(data) page += 1 return all_data ``` #### 5. **处理异常情况** 在实际爬取过程中,可能会遇到网络问题、页面结构变化等异常情况。因此,建议添加错误处理机制。 ```python try: data = scrape_data_with_limit(base_url, 1000) except Exception as e: print(f"An error occurred: {e}") finally: save_to_csv(data, 'output.csv') ``` --- ### 注意事项 - 如果目标网站有反爬机制(如 IP 封禁),可以考虑使用代理池或设置请求头模拟浏览器行为。 - 使用 pandas 库也可以简化 CSV 文件的入操作[^2]。 ```python import pandas as pd df = pd.DataFrame(data) df.to_csv('output.csv', index=False, encoding='utf-8') ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值