0

I am trying to find the number of child elements in a specific div. In BeautifulSoup you can call the contents method to order all the childs in a list (while preserving functionality, you can still do .find('something_to_find') on each item in the list). Is there an equivalent to this with Selenium?

tjblue
  • 33
  • 1
  • 5
  • 1
    Why not [get the HTML with selenium](https://stackoverflow.com/questions/7263824/get-html-source-of-webelement-in-selenium-webdriver-using-python) and then [parse it with bs4](https://stackoverflow.com/questions/49618479/html-parsing-using-bs4)? – forgetso Jul 08 '20 at 18:40
  • Thats definitely an option and how I normally do it. I was just wondering if there was a simpler way. – tjblue Jul 08 '20 at 19:06
  • probably in Selenium using `xpath` with `div/*` or `div/child::*` you could get all children but if you want to search in children you can do also `div/*/something_to_find`. Propably you could also use CSS selector `div > *` – furas Jul 08 '20 at 21:07

1 Answers1

0

In Selenium you can use XPath or CSS Selector to create more complex rules.

It seems you can using XPath //div/* or CSS selector div > * to get all children in div

To get all (not only children) xpath //div//* and CSS Selector div *

With XPath you can also get children with some restrictions - ie.

//div/*[b] - children with <b> inside.

//div/*[text()="Hello"] - children with text Hello.

Or even nested //div/*[b[text()="Title"]] - children with <b> which have text Title.


Example code

from selenium import webdriver
             
driver = webdriver.Firefox()

html = """
<html>
   <head></head>
   <body>
      <div>
        <h1><b>Title</b></h1>
        <span>Hello</span>
        <span>World<b> !!!</b></span>
        <p>Text</p>
      </div>
   </body>
</html>
"""

driver.get("data:text/html;charset=utf-8,{html}".format(html=html))

print('--- children ---')
for item in driver.find_elements_by_xpath('//div/*'):
    print(item.tag_name)

print('--- all ---')
for item in driver.find_elements_by_xpath('//div//*'):
    print(item.tag_name)
    
print('--- children ---')
for item in driver.find_elements_by_css_selector('div > *'):
    print(item.tag_name)

print('--- all ---')
for item in driver.find_elements_by_css_selector('div *'):
    print(item.tag_name)
  
print('--- children with <b> ---')
for item in driver.find_elements_by_xpath('//div/*[b]'):
    print(item.tag_name)
    
print('--- children with text "Hello" ---')
for item in driver.find_elements_by_xpath('//div/*[text()="Hello"]'):
    print(item.tag_name)
    
print('--- children with <b> which have text "Hello" ---')
for item in driver.find_elements_by_xpath('//div/*[b[text()="Title"]]'):
    print(item.tag_name)

Result:

--- children ---
h1
span
span
p
--- all ---
h1
b
span
span
b
p
--- children ---
h1
span
span
p
--- all ---
h1
b
span
span
b
p
--- children with <b>---
h1
span
--- children with <b>---
span
--- children with <b> which have text "Hello" ---
h1
furas
  • 134,197
  • 12
  • 106
  • 148