Selenium + Python。如何在特定元素中定位几个元素?

时间:2019-05-01 22:54:16

标签: python selenium

我正在使用Python + Selenium从列出公司信息的网站上抓取数据。

对于每个公司,我需要2个数据点-电子邮件和url。

问题是-对于某些公司,没有显示电子邮件,并且如果我分别获得URL和电子邮件列表,我将无法匹配该对(电子邮件列表将比URL列表短,我将'不知道哪些电子邮件丢失了。

因此,我想也许有一种方法可以获取每个公司块的根元素(例如,它是带有“ provider”类的div),然后在每个内部搜索电子邮件和url。

有可能吗?如果可以,怎么办?

3 个答案:

答案 0 :(得分:1)

有两种方法可以实现。

第一:只需使用选择器在该“ div”元素的子元素中查找该元素。您可以使用find_elements函数先检查有多少个父“ div”,然后循环很多次。不建议使用此方法。

第二:您可以在Webelement对象上调用find_element函数族。

假设我正在this网站上工作。

### First method:
FirstTitleInDiv = driver.find_element_by_css_selector(".row.test-site:nth-of-type(1) h2") # get first title
SecondTitleInDiv = driver.find_element_by_css_selector(".row.test-site:nth-of-type(2) h2") # get second title
# ... and so on.

### Second method:
Div_Els = driver.find_elements_by_css_selector(".row.test-site") # get list of all divs
# You can now loop through all divs in order to do following:
FirstTitleInDiv = Div_Els[0].find_element_by_css_selector("h2") # get first title
SecondTitleInDiv = Div_Els[1].find_element_by_css_selector("h2") # get second title
# ... and so on.

答案 1 :(得分:1)

这是完整的逻辑。

url = "https://clutch.co/web-designers?page=0"
driver.get(url)
pros = driver.find_elements_by_css_selector("li.provider-row")
providers =[]
for provider in pros:

    pUrl = provider.find_element_by_css_selector(".website-link.website-link-a a").get_attribute("realurl")
    if (len(provider.find_elements_by_css_selector(".contact-dropdown .item a"))>0):
        pEmail = provider.find_element_by_css_selector(".contact-dropdown .item a").get_attribute('textContent')
    else:
        pEmail=''
    providers.append("{" + pUrl + "," +  pEmail + "}")
print(providers)

答案 2 :(得分:0)

好,我找到了解决方法。

首先,您收集需要获取字段的所有块。示例:

providers = browser.find_elements_by_class_name('provider-row')

然后将find_elements_by_xpath()方法与以“ .//”开头的定位符一起使用,这意味着在特定元素内进行搜索。示例:

providers[0].find_elements_by_xpath(".//li[@class='website-link website-link-a']/a[@class='sl-ext']")