【问题标题】:How to get all xml/dom as text under a parent web element using selenium/python?如何使用 selenium/python 将所有 xml/dom 作为文本在父 Web 元素下获取?
【发布时间】:2019-01-31 05:44:38
【问题描述】:

我有一个场景需要处理显示为网格的 UI 对象,但行和列是包含在 xml / dom 层次结构中的单独 Web 元素,由多个 xpath 组成,可以使用通用模式进行解析。 所有这些元素都包含与列类型对应的文本。 通过webelement引用获取所有这些文本需要时间。 有没有办法将所有这些 xml 作为文本(或一次至少一行)通过解析整个 xml 内联来节省提取时间。

例如,考虑底部提到的 xml。如何将<div[@class='table']> 下的所有 xml 层次结构作为要解析的文本。

这是示例:

<div[@class='table']>
     <div[@class='rows']>
          <div[@class='row']>
               <div[@class='col']>
                   <div[@class='element']>some_text1</div[@class='element']>
                   <div[@class='element']>some_text2</div[@class='element']>
                   <div[@class='element']>some_text3</div[@class='element']>
                   ...
               </div[@class='col']>
          </div[@class='row']>
          <div[@class='row']>
               <div[@class='col']>
                   <div[@class='element']>some_text1</div[@class='element']>
                   <div[@class='element']>some_text2</div[@class='element']>
                   <div[@class='element']>some_text3</div[@class='element']>
                   ...
               </div[@class='col']>
          </div[@class='row']>
          <div[@class='row']>
               ...
          </div[@class='row']>
          <div[@class='row']>
               ...
          </div[@class='row']>
          <div[@class='row']>
               ...
          </div[@class='row']>
     </div[@class='rows']>
</div[@class='table']>

我需要获取下面提到的 xml/dom/div 层次结构:

    <div[@class='rows']>
          <div[@class='row']>
               <div[@class='col']>
                   <div[@class='element']>some_text1</div[@class='element']>
                   <div[@class='element']>some_text2</div[@class='element']>
                   <div[@class='element']>some_text3</div[@class='element']>
                   ...
               </div[@class='col']>
          </div[@class='row']>
          <div[@class='row']>
               <div[@class='col']>
                   <div[@class='element']>some_text1</div[@class='element']>
                   <div[@class='element']>some_text2</div[@class='element']>
                   <div[@class='element']>some_text3</div[@class='element']>
                   ...
               </div[@class='col']>
          </div[@class='row']>
          <div[@class='row']>
               ...
          </div[@class='row']>
          <div[@class='row']>
               ...
          </div[@class='row']>
          <div[@class='row']>
               ...
          </div[@class='row']>
     </div[@class='rows']>

一口气。

【问题讨论】:

  • 用基于文本的实际 HTML 代替手工制作的 HTML 更新问题
  • 不知道为什么通过webelement引用获取所有这些文本需要时间。或许有没有办法将所有这些 xml 作为文本获取至少单行中的一行 是矛盾的用例。请edit the question 将其限制为具有足够详细信息的特定问题,以确定适当的答案。避免一次问多个不同的问题。请参阅How to Ask 页面以获得澄清此问题的帮助。你想做什么?
  • 您是否尝试过获取顶级表格标签,然后使用.text,看看您得到了什么?这应该可以让您按照您的意愿解析整个表格的文本。不过,我认为这不是一个好主意。
  • 感谢所有 cmets - @DebanjanB - 我已经编辑了这个问题。希望您理解,但由于公司隐私原因,我无法提供确切的 html。我相信一次获取 xml/dom 将需要一次操作 O(1),而一个接一个地获取多个元素将需要随着元素数量的增加而进行的操作 O(n)。如果您有其他感觉,请告诉我。
  • @JeffC - 获取文本将不起作用,因为文本可能是多行的,并且更难以解析。 Innerhtml 会更容易解析。

标签: python python-3.x selenium selenium-webdriver


【解决方案1】:
element = driver.find_element_by_xpath("//div[@class='table']").get_attribute('outerHTML')

属性 outerHTML will return you the element itself and all its child nodes - 因为它们存在于 DOM 中。
我建议不要使用类似的innerHTML,因为如果目标元素有一个文本子节点,你会收到它,但结果不会是正确的 xml。

【讨论】:

  • 工作完美,谢谢
【解决方案2】:

请试试这个:

 WebElement element = driver.find_element_by_xpath("//div[@class='table']");
 String elementText = element.text;

在字符串“elementText”中,您将获得表格层次结构中存在的全部文本。

【讨论】:

  • 谢谢,但这只会返回表格的文本 - 我需要整个 xml 定义。
  • 然后不是从@class='table' 获取xpath。您可以在其中使用父类名称,然后您将获得整个文本。
  • 能否请您提供类似“some_web_element.get_contained_xml()”之类的语法?
  • 你也需要 div 层次结构吗?抱歉,但想了解它的用例是什么,因为这样我就能更好地帮助你
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 2022-01-03
  • 2018-11-09
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多