Webdriver:当 class name 包含 space 时如何查找元素?
Webdriver: How to find elements when class name contains space?
每个“7 件装”搜索结果 here 都包含许多评论,例如“5 条评论”、“无评论”等
每个 class 的名称是 fl r-iNTHbQvDybDU
。它包含一个 space,所以如果我尝试 find_elements_by_class_name(),我得到:
InvalidSelectorError: Compound class names not permitted
根据此处的其他答案,我需要做的就是删除 space 并重试。运气不好 - 空列表
所以我尝试 find_element_by_css_selector()
:
find_elements_by_css_selector(".fl.r-iNTHbQvDybDU")
仍然没有运气 - 空列表。接下来你会尝试什么?
试试这个:
find_elements_by_css_selector(".r-iNTHbQvDybDU")
我不会依赖这些自动生成的 class 名称。除了不可靠之外,它还会降低您的代码的可读性。相反,获取包含 "review" 文本 .
的 链接
与线程的组合解决方案:
import re
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.google.com/?gws_rd=ssl#q=plumbers%2BAvondale%2BAZ')
# waiting for results to load
wait = WebDriverWait(driver, 10)
box = wait.until(EC.visibility_of_element_located((By.ID, "lclbox")))
phone_re = re.compile(r"\(\d{3}\) \d{3}-\d{4}")
for result in box.find_elements_by_class_name("intrlu"):
for span in result.find_elements_by_tag_name("span"):
if phone_re.search(span.text):
parent = span.find_element_by_xpath("../..")
print parent.text
break
try:
reviews = result.find_element_by_partial_link_text("review").text
except NoSuchElementException:
reviews = "0 Google reviews"
print reviews
print "-----"
打印:
360 N Central Ave
Avondale, AZ
(623) 455-6605
1 Google review
-----
Avondale, AZ
(623) 329-5170
4 Google reviews
-----
Tolleson, AZ
(623) 207-1995
7 Google reviews
-----
3947 N 146th Dr
Goodyear, AZ
(602) 446-6576
1 Google review
-----
564 W Western Ave
Goodyear, AZ
(623) 455-6605
0 Google reviews
-----
14190 W Van Buren St
Goodyear, AZ
(623) 932-5300
0 Google reviews
-----
这个怎么样:
browser.find_elements_by_css_selector("div[class='fl r-iNTHbQvDybDU']")
这假定了 class = div
的标签。
如果是其他东西 - 否则用适当的标签替换 div..
你需要在它前面加上标签名称。
比如在div元素里面,那么:
Selenium.find_element_by_class_name(div.ur.class.name)
每个“7 件装”搜索结果 here 都包含许多评论,例如“5 条评论”、“无评论”等
每个 class 的名称是 fl r-iNTHbQvDybDU
。它包含一个 space,所以如果我尝试 find_elements_by_class_name(),我得到:
InvalidSelectorError: Compound class names not permitted
根据此处的其他答案,我需要做的就是删除 space 并重试。运气不好 - 空列表
所以我尝试 find_element_by_css_selector()
:
find_elements_by_css_selector(".fl.r-iNTHbQvDybDU")
仍然没有运气 - 空列表。接下来你会尝试什么?
试试这个:
find_elements_by_css_selector(".r-iNTHbQvDybDU")
我不会依赖这些自动生成的 class 名称。除了不可靠之外,它还会降低您的代码的可读性。相反,获取包含 "review" 文本 .
的 链接与
import re
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.google.com/?gws_rd=ssl#q=plumbers%2BAvondale%2BAZ')
# waiting for results to load
wait = WebDriverWait(driver, 10)
box = wait.until(EC.visibility_of_element_located((By.ID, "lclbox")))
phone_re = re.compile(r"\(\d{3}\) \d{3}-\d{4}")
for result in box.find_elements_by_class_name("intrlu"):
for span in result.find_elements_by_tag_name("span"):
if phone_re.search(span.text):
parent = span.find_element_by_xpath("../..")
print parent.text
break
try:
reviews = result.find_element_by_partial_link_text("review").text
except NoSuchElementException:
reviews = "0 Google reviews"
print reviews
print "-----"
打印:
360 N Central Ave
Avondale, AZ
(623) 455-6605
1 Google review
-----
Avondale, AZ
(623) 329-5170
4 Google reviews
-----
Tolleson, AZ
(623) 207-1995
7 Google reviews
-----
3947 N 146th Dr
Goodyear, AZ
(602) 446-6576
1 Google review
-----
564 W Western Ave
Goodyear, AZ
(623) 455-6605
0 Google reviews
-----
14190 W Van Buren St
Goodyear, AZ
(623) 932-5300
0 Google reviews
-----
这个怎么样:
browser.find_elements_by_css_selector("div[class='fl r-iNTHbQvDybDU']")
这假定了 class = div
的标签。
如果是其他东西 - 否则用适当的标签替换 div..
你需要在它前面加上标签名称。
比如在div元素里面,那么:
Selenium.find_element_by_class_name(div.ur.class.name)