从 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']
那么您还需要检查以下条件。
检查它是否在任何 iframe/frame/frameset
.
解决方法:先切换到iframe/frame/frameset,再与该网页元素交互
检查它是否在任何 shadow-root
.
解决方法:使用driver.execute_script('return document.querySelector
返回一个web元素,然后进行相应的操作。
确保在与元素交互之前正确呈现该元素。放一些 hardcoded delay
或 Explicit 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
如果您已重定向到 new tab/ or new windows
而您还没有 切换 到那个特定的 new tab/new window
,否则您可能会得到NoSuchElement
异常。
解决方法:先切换到相关window/tab
如果您已切换到 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
我正在尝试从 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']
那么您还需要检查以下条件。
检查它是否在任何
iframe/frame/frameset
.解决方法:先切换到iframe/frame/frameset,再与该网页元素交互
检查它是否在任何
shadow-root
.解决方法:使用
driver.execute_script('return document.querySelector
返回一个web元素,然后进行相应的操作。确保在与元素交互之前正确呈现该元素。放一些
hardcoded delay
或Explicit 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
如果您已重定向到
new tab/ or new windows
而您还没有 切换 到那个特定的new tab/new window
,否则您可能会得到NoSuchElement
异常。解决方法:先切换到相关window/tab
如果您已切换到 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')
似乎父 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
使用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