Webdriver / Selenium:当没有类名,id或css selecector时如何查找元素?

时间:2015-06-26 14:15:34

标签: python html selenium selenium-webdriver webdriver

每个“7-pack”搜索结果here包含右下方每个条目的地址和电话号码:

enter image description here

对于每一个,我想提取(i)地址和(ii)电话号码。问题是,这里是如何在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>

所以没有类名,css选择器或id我可以使用find_element_by *(),我不会知道链接文本,因此我不能使用find_element_by_partial_link_text(),而WebDriver不提供据我所知,一种按风格查找的方法。我们如何解决这个问题?对于每个搜索结果,我需要能够可靠地为不同的查询提取正确的数据。

与WebDriver的语言绑定是Python。

1 个答案:

答案 0 :(得分:4)

您可以依赖至少两个关键事项:包含id="lclbox"的容器框和与每个结果项对应的class="intrlu"元素。

如何从每个结果项中提取地址和电话号码可能会有所不同,这里有一个选项(绝对不是很漂亮),包括通过每个span元素文本的正则表达式检查来查找电话号码:

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
-----