Webdriver/Selenium: 当元素没有 class 名称、id 或 css 选择器时如何查找元素?
Webdriver/Selenium: How to find element when it has no class name, id, or css selecector?
每个“7 件装”搜索结果 here 都包含一个地址和一个 phone 右侧每个条目的编号,因此:
对于每个,我想提取 (i) 地址和 (ii) phone 号码。问题是,这些元素是如何在 HTML:
中定义的
<div style="width:146px;float:left;color:#808080;line-height:18px"><span>Houston, TX</span><br><span>United States</span><br><nobr><span>(713) 766-6663</span></nobr></div>
所以没有 class 名称、css 选择器或 id,我可以从中使用 find_element_by*(),我不知道 link 文本,所以我不能使用 find_element_by_partial_link_text(),据我所知,WebDriver 没有提供按样式查找的方法。我们如何解决这个问题?对于不同的查询,我需要每次都能可靠地为每个搜索结果提取正确的数据。
WebDriver 的语言绑定是 Python。
至少有两个关键点可以依赖:id="lclbox"
的容器框和 class="intrlu"
对应于每个结果项的元素。
如何从每个结果项中提取地址和 phone 数字可能会有所不同,这里是一个选项(绝对不漂亮)涉及通过每个 [的正则表达式检查来定位 phone 数字=14=] 元素文字:
import re
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%2Bhouston%2Btx')
# 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
print "-----"
我很确定它可以改进,但希望它能给你一个起点。打印:
Houston, TX
(713) 812-7070
-----
Houston, TX
(713) 472-5554
-----
6646 Satsuma Dr
Houston, TX
(713) 896-9700
-----
1420 N Durham Dr
Houston, TX
(713) 868-9907
-----
5630 Edgemoor Dr
Houston, TX
(713) 665-5890
-----
5403 Kirby Dr
Houston, TX
(713) 224-3747
-----
Houston, TX
(713) 385-0349
-----
每个“7 件装”搜索结果 here 都包含一个地址和一个 phone 右侧每个条目的编号,因此:
对于每个,我想提取 (i) 地址和 (ii) phone 号码。问题是,这些元素是如何在 HTML:
中定义的<div style="width:146px;float:left;color:#808080;line-height:18px"><span>Houston, TX</span><br><span>United States</span><br><nobr><span>(713) 766-6663</span></nobr></div>
所以没有 class 名称、css 选择器或 id,我可以从中使用 find_element_by*(),我不知道 link 文本,所以我不能使用 find_element_by_partial_link_text(),据我所知,WebDriver 没有提供按样式查找的方法。我们如何解决这个问题?对于不同的查询,我需要每次都能可靠地为每个搜索结果提取正确的数据。
WebDriver 的语言绑定是 Python。
至少有两个关键点可以依赖:id="lclbox"
的容器框和 class="intrlu"
对应于每个结果项的元素。
如何从每个结果项中提取地址和 phone 数字可能会有所不同,这里是一个选项(绝对不漂亮)涉及通过每个 [的正则表达式检查来定位 phone 数字=14=] 元素文字:
import re
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%2Bhouston%2Btx')
# 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
print "-----"
我很确定它可以改进,但希望它能给你一个起点。打印:
Houston, TX
(713) 812-7070
-----
Houston, TX
(713) 472-5554
-----
6646 Satsuma Dr
Houston, TX
(713) 896-9700
-----
1420 N Durham Dr
Houston, TX
(713) 868-9907
-----
5630 Edgemoor Dr
Houston, TX
(713) 665-5890
-----
5403 Kirby Dr
Houston, TX
(713) 224-3747
-----
Houston, TX
(713) 385-0349
-----