如何在 selenium (python) 中接收子节点的内部 HTML?

How to recieve inner HTML of a child node in selenium (python)?

我正在尝试遍历多个节点并从父节点接收各种子节点。假设我有类似以下结构的东西:

<div class="wrapper">
    <div class="item">
        <div class="item-footer">
            <div class="item-type">Some data in here</div>
        </div>
    </div>
    <!-- More items listed here -->
</div>

我可以使用以下方法接收包装器容器的所有子节点。

wrapper = driver.find_element(By.XPATH, '/html/body/div')
items = wrapper.find_elements(By.XPATH, './/*')

无论如何,我现在无法弄清楚如何接收包含有关项目类型信息的容器的内部 HTML。我试过了,但是没用。

for item in items:
    item_type = item.item.find_element(By.XPATH, './/div/div').get_attribute('innerHTML')
    print(item_type)

这会导致以下错误:

NoSuchElementException: Message: Unable to locate element:

有人知道我该怎么做吗?

从 selenium 获取页面源后,您可以使用 BeautifulSoup 轻松抓取 HTML 数据。

from bs4 import BeautifulSoup

# selenium code part
# ....
# ....
# driver.page_source is the HTML result from selenium

html_doc = BeautifulSoup(driver.page_source, 'html.parser')
items = html_doc.find_all('div', attrs={'class':'item'})
for item in items:
    text = item.find('div', attrs={'class':'item-type'}).text
    print(text)

输出:

Some data in here

如果您要获取的所有元素的内容都是 div,属性值 class item-type 位于 div 内,属性为 classitem-footer 您可以简单地执行以下操作:

elements =  driver.find_element(By.XPATH, '//div[@class="item-footer"]//div[@class="item-type"]')
for element in elements:
    data = element.get_attribute('innerHTML')
    print(data)

你只需要找到相对的 xpath 来识别每个元素然后迭代它。

items = driver.find_elements(By.XPATH, "//div[@class='wrapper']//div[@class='item']//div[@class='item-type']")
for item in items:
    print(item.text)
    print(item.get_attribute('innerHTML'))

或者使用css选择器

items = driver.find_elements(By.CSS_SELECTOR, ".wrapper >.item .item-type")
for item in items:
    print(item.text)
    print(item.get_attribute('innerHTML'))