【问题标题】:Get XPath of an element in DOM tree?获取 DOM 树中元素的 XPath?
【发布时间】:2014-07-22 19:15:44
【问题描述】:

我在 python 中使用 lxml 实现来进行 HTML 和 XML 解析。 设置解析器,如

parser = lxml.etree.HTMLParser()

并从 HTML 源代码返回树(字符串)

tree = lxml.etree.fromstring(html, parser).getroottree() # Returns a XML tree

根据 lxml 文档,这应该返回一个 DOM 树 (XML)

我想找到某些带有“a”、“div”、“span”等标签的元素。

如何使用标签名称获取所有可能元素的 XPath

编辑:我实际上是在开发一个 AJAX 爬虫,所以我需要 Selenium 来点击某些可以改变 DOM 状态的元素。我将 HTML 源代码发送到 lxml 进行分析。

例如,采用列表中的默认元素,如

["a", "button", "li", "nav", "ol", "span", "ul", "header", "footer", "section"]

我需要获取上述元素的 xpath,以便我可以将它们传递给 Selenium 以进行点击和其他事件触发器。

【问题讨论】:

  • 您能否提供一个简单的示例:输入(html 片段)和所需的输出?谢谢。

标签: python dom selenium xpath lxml


【解决方案1】:

你真的不需要使用单独的解析器,selenium 本身就Locating Elements 而言非常强大:

from selenium import webdriver

browser = webdriver.Firefox()
browser.get('url_goes_here')
list_of_elements = ["a", "button", "li", "nav", "ol", "span", "ul", "header", "footer", "section"]
for tag_name in list_of_elements:
    for element in browser.find_elements_by_tag_name(tag_name):
         print element

【讨论】:

  • 但是 Selenium 是让它变慢的原因。您知道使用 lxml 执行此操作的方法吗?谢谢。
  • @user3623152 我认为你必须坚持使用selenium,因为你需要 webdriver 元素实例来进行进一步的操作——你说过你需要点击并触发找到的元素上的事件。
【解决方案2】:

我一直发现使用“美汤”可以让这类事情变得更容易。

http://lxml.de/elementsoup.html

这里已经有很多类似的问题了,试试吧:

retrieve links from web page using python and BeautifulSoup

【讨论】:

  • 美汤太麻烦了,解析不如lxml好快。这是考虑到我需要爬虫高性能。此外,您提供的链接只是从 HTML 源获取 href 链接。
  • 抱歉,您的问题在我发帖时已更新。我从来没有遇到过 bs 的性能问题,但我通常将它用于离线、事后数据处理。
  • 看看lxml,它很快,真的很快,擅长破坏HTML。如果我将爬虫给蜘蛛也许 5 个目标,那么 BS 将是一个巨大的瓶颈。 :)
  • Beautiful soup 在构造函数中采用解析器参数。我告诉美汤使用 lxml 作为解析器。
猜你喜欢
  • 2016-07-26
  • 2017-05-20
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
相关资源
最近更新 更多