【问题标题】:Selenium / XPath Getting HTML between two tagsSelenium / XPath 在两个标签之间获取 HTML
【发布时间】:2021-03-31 11:02:01
【问题描述】:

如何提取

  • 消息名称(例如Message 1),
  • 收到的时间戳(例如Received: 214-2342-234),
  • 也是最难的:消息文本(例如This is message nr. 1 it contains...

这个 HTML 使用 Selenium 4(最好是 XPath)? 我正在使用 Python。

<body>
  <p class="pclass">
    <a name="msg1"></a>
    Message 1:
    <a href="..."> Link1</a>
    <span> Received: 214-2342-234</span>
  </p>
  <br>This is message nr. 1 it contains different stuff like <b>bold text</b>, etc.<br><br>

  <p class="pclass">
    <a name="msg2"></a>
    Message 2:
    <a href="..."> Link1</a>
    <span> Received: 214-46546-23532</span>
  </p>
  <br>Message nr. 2 may contain other stuff (maybe even a table...)<br><br>

  <p class="pclass">
    <a name="msg3"></a>
    Message 3:
    <a href="..."> Link1</a>
    <a href="..."> Link2</a>
    <span> Received: 214-7876967666</span>
  </p>
  <br>This message contained 2 hyperlinks before the received-timestamp.<br><br>

  <a href="close.php">Close Messages</a>
</body>

查询节点内的数据非常简单,但是标签之间的文本呢? 我目前拥有的是'msg1','msg2',...:

msgs = driver.find_elements(By.XPATH, "//a[starts-with(@name, 'msg')]")
print(msgs[0].get_attribute('name')) # prints 'msg1'

【问题讨论】:

  • 根据给定的 html,您确定 html 是正确的吗?这是消息 nr。 1 它包含不同的东西,比如在 bodt 标签内

标签: javascript python selenium xpath webdriverwait


【解决方案1】:

基于您的 HTML 是的,您可以使用字符串操作和其他方法(如 Splitlines() 和 js 执行器)来实现。

识别p标签,然后找到childNodes值,然后找到span文本。

断线需要识别body tag,然后使用Splitlines()

代码:

i=2
for item in driver.find_elements_by_css_selector('p.pclass'):
    print(driver.execute_script('return arguments[0].childNodes[2].textContent;', item).strip())
    print(item.find_element_by_xpath("./span").text)
    message=driver.find_element_by_tag_name("body").text.splitlines()
    print(message[i])
    i=i+4
    print("#########################################")

控制台输出:

Message 1:
Received: 214-2342-234
This is message nr. 1 it contains different stuff like bold text, etc.
#########################################
Message 2:
Received: 214-46546-23532
Message nr. 2 may contain other stuff (maybe even a table...)
#########################################
Message 3:
Received: 214-7876967666
This message contained 2 hyperlinks before the received-timestamp.
#########################################

【讨论】:

    【解决方案2】:
    1. 消息名称

      text = driver.find_element_by_xpath('/html/body/p[2]').get_attribute('innerText') name = text.split(':')[0] print(name)

    2. 收到的时间戳

      timestamp = driver.find_element_by_xpath('/html/body/p[1]/span').get_attribute('innerText') print(timestamp)

    3. 消息文本

      import re

      message_text = driver.find_element_by_tag_name('body').get_attribute('innerText') print(re.findall(re.escape('\n\n\n')+"(.*)"+re.escape('\n\n\n\n'),message_text)[0])

    【讨论】:

      【解决方案3】:

      要从文本节点中提取文本,你必须为WebDriverWait诱导visibility_of_element_located()可以使用以下解决方案:

      • 使用XPATHsplitlines()

        • 提取消息1:

          print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//body/p[@class='pclass']"))).get_attribute("innerHTML").splitlines()[1])
          
        • 提取收到:214-2342-234

          print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//body/p[@class='pclass']//span"))).text)
          
        • 提取 这是消息 nr。 1 它包含... :

          print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//body"))).get_attribute("innerHTML").splitlines()[7])
          
      • 使用XPATHchildNodes

        • 提取消息1:

          print(driver.execute_script('return arguments[0].childNodes[2].textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//body/p[@class='pclass']")))).strip())
          
        • 提取收到:214-2342-234

          print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//body/p[@class='pclass']//span"))).text)
          
        • 提取 这是消息 nr。 1 它包含... :

          print(driver.execute_script('return arguments[0].childNodes[3].textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "body")))).strip())
          
      • 注意:您必须添加以下导入:

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

      参考文献

      您可以在以下位置找到一些相关的详细讨论:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 2019-02-01
        • 1970-01-01
        相关资源
        最近更新 更多