当前位置: 首页 > 面试题库 >

使用Selenium从网页获取所有可见文本

孙池暝
2023-03-14
问题内容

我整天一直在搜寻,找不到答案,因此如果已经回答了,请提前道歉。

我正在尝试从大量不同的网站中获取所有可见的文本。原因是我要处理文本以最终对网站进行分类。

经过几天的研究,我认为硒是我最好的机会。我发现一种使用Selenium来捕获所有文本的方法,不幸的是同一文本被多次捕获:

from selenium import webdriver
import codecs

filen = codecs.open('outoput.txt', encoding='utf-8', mode='w+')

driver = webdriver.Firefox()

driver.get("http://www.examplepage.com")

allelements = driver.find_elements_by_xpath("//*")

ferdigtxt = []

for i in allelements:

      if i.text in ferdigtxt:
          pass
  else:
         ferdigtxt.append(i.text)
         filen.writelines(i.text)

filen.close()

driver.quit()

if内部条件for环路消除同一文本多次读取的问题的尝试-但是,它没有,只是作为计划在某些网页的工作。(这也使脚本慢很多)

我猜我的问题的原因是-当询问元素的内部文本时-我也得到了嵌套在所讨论元素内部的元素的内部文本。

有没有办法解决?我是否掌握某种内部元素?还是完全不同的方式可以使我实现自己的目标?任何帮助都将不胜感激,因为我对此一无所知。

编辑:之所以使用Selenium而不是机械化和美丽的汤是因为我想要JavaScript招标文本


问题答案:

使用lxml,您可以尝试如下操作:

import contextlib
import selenium.webdriver as webdriver
import lxml.html as LH
import lxml.html.clean as clean

url="http://www.yahoo.com"
ignore_tags=('script','noscript','style')
with contextlib.closing(webdriver.Firefox()) as browser:
    browser.get(url) # Load page
    content=browser.page_source
    cleaner=clean.Cleaner()
    content=cleaner.clean_html(content)    
    with open('/tmp/source.html','w') as f:
       f.write(content.encode('utf-8'))
    doc=LH.fromstring(content)
    with open('/tmp/result.txt','w') as f:
        for elt in doc.iterdescendants():
            if elt.tag in ignore_tags: continue
            text=elt.text or ''
            tail=elt.tail or ''
            words=' '.join((text,tail)).strip()
            if words:
                words=words.encode('utf-8')
                f.write(words+'\n')

除了图像中的文字和随时间变化的某些文字(使用javascript完成并刷新)之外,这似乎可以获取www.yahoo.com上几乎所有的文字。



 类似资料:
  • 引导表有一个获取所有隐藏行的方法: getRowsHidden;布尔型;将所有行隐藏起来,如果您传递show参数true,这些行将再次显示,否则,该方法将只返回隐藏的行。 它也有 getHiddenColumns-获取隐藏列。 getVisibleColumns-获取可见列 但是,如何使用BT方法或JQuery组合获得所有可见行?

  • 问题内容: 如何使用不带HTML标记的Selenium Webdriver获得网页的可见文本部分? 我需要与Htmlunit中的函数HtmlPage.asText()等效的东西。 仅使用WebDriver.getSource函数获取文本并使用jsoup解析文本是不够的,因为页面中可能存在隐藏的元素(通过外部CSS),我对此并不感兴趣。 问题答案: 这样做(或使用其他选择器选择顶部元素),然后对该元

  • 问题内容: 基本上,我想使用来严格抓取网页上的可见文本。例如,此网页是我的测试用例。我主要想获取正文文本(文章),甚至在这里和那里甚至几个标签名称。我已经尝试过在这个SO问题中返回不想要的标签和html注释的建议。我无法弄清楚该函数所需的参数,以便仅获取网页上的可见文本。 那么,我应该如何查找除脚本,注释,CSS等之外的所有可见文本? 问题答案: 尝试这个:

  • 问题内容: 我想使用Selenium从DOM中提取一些信息。我正在使用C#WebDriver。 查看IWebElement接口,您可以轻松提取给定的属性。但是,我想提取一个元素的所有属性而无需事先知道它们的名称。 必须有一些简单的方法来执行此操作,因为如果您知道属性名称,则可以使用一种方法来获取属性值。 一个例子: 希望我缺少明显的东西。 提前致谢! 问题答案: JavaScript中的属性将返回

  • 我想用Selenium从DOM中提取一些信息。我正在使用C#WebDriver。 查看IWebElement接口,您可以轻松提取给定的属性。然而,我想提取一个元素的所有属性,而不需要事先知道它们的名称。 必须有一些简单的方法来实现这一点,因为有一种方法可以获取属性值,如果您知道它的名称。 例如: 希望我错过了一些明显的东西。 提前感谢!

  • 我正在使用jsoup库,今天我遇到了一个问题。我必须刮取DuckDuckGo并为每个页面获取查询结果的所有标题,但使用 我只得到关于第一页的结果。我怎样才能继续下一页?