Есть ли эквивалент в селене для .contents bs4? - PullRequest
0 голосов
/ 08 июля 2020

Я пытаюсь найти количество дочерних элементов в c div. В BeautifulSoup вы можете вызвать метод contents, чтобы упорядочить все дочерние элементы в списке (при сохранении функциональности вы все равно можете выполнить .find('something_to_find') для каждого элемента в списке). Есть ли аналог этого с Selenium?

1 Ответ

0 голосов
/ 09 июля 2020

В Selenium вы можете использовать XPath или CSS Selector для создания более сложных правил.

Кажется, вы можете использовать XPath //div/* или CSS селектор div > *, чтобы получить все дочерние элементы в div

Чтобы получить все (не только дочерние элементы) xpath //div//* и CSS Selector div *

С XPath вы также можете получить дочерние элементы с некоторыми ограничениями - ie.

//div/*[b] - дети с <b> внутри.

//div/*[text()="Hello"] - дети с текстом Hello.

Или даже вложенными //div/*[b[text()="Title"]] - дети с <b> которые имеют текст Title.

Пример кода

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)

Результат:

--- 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...