从 div class Python Selenium 中提取数据

Pull data from a div class Python Selenium

我正在尝试从 Python Selenium 中的 div class 中提取特定数字,但不知道该怎么做。我想获得“post_parent”ID 947630,只要它与“post_name”数字开头 09007.

相匹配

我希望在多个“post_name”classes 中执行此操作,所以我会像这样提供它:search_text = "0900766b80090cb6",但会有多个未来所以它必须先读取“post_name”然后拉“post_parent”如果这是有道理的。

感谢任何人提供的任何建议。

    <div class="hidden" id="inline_947631">
    <div class="post_title">Interface Converter</div>
    <div class="post_name">0900766b80090cb6</div>
    <div class="post_author">28</div>
    <div class="comment_status">closed</div>
    <div class="ping_status">closed</div>
    <div class="_status">inherit</div>
    <div class="jj">06</div>
    <div class="mm">07</div>
    <div class="aa">2001</div>
    <div class="hh">15</div>
    <div class="mn">44</div>
    <div class="ss">17</div>
    <div class="post_password"></div>
    <div class="post_parent">947630</div>
    <div class="page_template">default</div>
    <div class="tags_input" id="rs-language-code_947631">de</div>
    </div>

如果你看到 <div class="post_name">0900766b80090cb6</div> 这和 <div class="post_parent">947630</div> 是彼此的兄弟节点。

你可以这样使用xpath -> following-sibling

代码:

search_text = "0900766b80090cb6"
post_parent_num = driver.find_element(By.XPATH, f"//div[@class='post_name' and text()='{search_text}']//following-sibling::div[@class='post_parent']").text
print(post_parent_num)

或使用 ExplicitWait:

search_text = "0900766b80090cb6"
post_parent_num = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, f"//div[@class='post_name' and text()='{search_text}']//following-sibling::div[@class='post_parent']"))).get_attribute('innerText')
print(post_parent_num)

进口:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

更新:

NoSuchElementException:

请检查 dev tools (Google chrome) 我们是否在 HTML-DOM 中有 unique 条目。

你应该检查的 xpath :

//div[@class='post_name' and text()='0900766b80090cb6']//following-sibling::div[@class='post_parent']

检查步骤:

Press F12 in Chrome -> 转到 element 部分 -> 执行 CTRL + F -> 然后粘贴 xpath 并查看是否需要 element正在 突出显示 1/1 匹配节点。

如果这是唯一的 //div[@class='post_name' and text()='0900766b80090cb6']//following-sibling::div[@class='post_parent'] 那么您还需要检查以下条件。

  1. 检查它是否在任何 iframe/frame/frameset.

    解决方法:先切换到iframe/frame/frameset,再与该网页元素交互

  2. 检查它是否在任何 shadow-root.

    解决方法:使用driver.execute_script('return document.querySelector返回一个web元素,然后进行相应的操作。

  3. 确保在与元素交互之前正确呈现该元素。放一些 hardcoded delayExplicit wait 然后再试一次。

    解决方法: time.sleep(5) 或者

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='post_name' and text()='0900766b80090cb6']//following-sibling::div[@class='post_parent']"))).text

  4. 如果您已重定向到 new tab/ or new windows 而您还没有 切换 到那个特定的 new tab/new window,否则您可能会得到NoSuchElement异常。

    解决方法:先切换到相关window/tab

  5. 如果您已切换到 iframe 并且所需的新元素不在同一个 iframe 上下文中,那么首先 switch to default content 然后与之交互。

    解决方法:切换到默认内容,然后切换到各自的iframe。

您可以创建一个方法并使用以下 xpath 来根据 post_name 文本获取 post_parent 文本。

def getPostPatent(postname):
    element=driver.find_element(By.XPATH,"//div[@class='post_name' and starts-with(text(),'{}')]/following-sibling::div[@class='post_parent']".format(postname))
    print(element.get_attribute("textContent"))

getPostPatent('09007') 

如果匹配文本 starts-with('09007')

,这将 return 值

似乎父 class 被隐藏了,您需要使用 textContent 来获取值。

我没有看到“post_parent”ID 947630 和“post_name”编号 09007 之间的任何特定关系。此外, parent <div>class="hidden".

但是,要提取特定号码,您可以使用以下任一方法 :

  • 使用css_selector:

    print(driver.find_element(By.CSS_SELECTOR, "div[id^='inline'] div.post_parent").text)
    
  • 使用 xpath:

    print(driver.find_element(By.XPATH, "//div[starts-with(@id, 'inline_')]//div[@class='post_parent']").text)
    

理想情况下你需要诱导 WebDriverWait for the and you can use either of the following :

  • 使用CSS_SELECTOR:

    print(WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div[id^='inline'] div.post_parent"))).text)
    
  • 使用 XPATH:

    print(WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[starts-with(@id, 'inline_')]//div[@class='post_parent']"))).text)
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC