簡體   English   中英

使用Selenium從網頁獲取所有可見文本

[英]Getting all visible text from a webpage using Selenium

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

我正在嘗試從大量不同的網站獲取所有可見的文本。 原因是我要處理文本以最終對網站進行分類。

經過幾天的研究,我認為硒是我最好的機會。 我發現了一種使用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()

for循環中的if條件是為了消除多次讀取相同文本的問題的嘗試-但是,它不能僅按計划在某些網頁上工作。 (這也使腳本慢很多)

我猜想我的問題的原因是-當要求元素的內部文本時,我還會得到嵌套在相關元素內部的元素的內部文本。

有沒有辦法解決? 我是否掌握某種內部元素? 還是完全不同的方式可以使我實現自己的目標? 任何幫助都將不勝感激,因為我對此一無所知。

編輯:之所以使用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上幾乎所有的文本。

這是@unutbu的答案的變體:

#!/usr/bin/env python
import sys
from contextlib import closing

import lxml.html as html # pip install 'lxml>=2.3.1'
from lxml.html.clean        import Cleaner
from selenium.webdriver     import Firefox         # pip install selenium
from werkzeug.contrib.cache import FileSystemCache # pip install werkzeug

cache = FileSystemCache('.cachedir', threshold=100000)

url = sys.argv[1] if len(sys.argv) > 1 else "https://stackoverflow.com/q/7947579"


# get page
page_source = cache.get(url)
if page_source is None:
    # use firefox to get page with javascript generated content
    with closing(Firefox()) as browser:
        browser.get(url)
        page_source = browser.page_source
    cache.set(url, page_source, timeout=60*60*24*7) # week in seconds


# extract text
root = html.document_fromstring(page_source)
# remove flash, images, <script>,<style>, etc
Cleaner(kill_tags=['noscript'], style=True)(root) # lxml >= 2.3.1
print root.text_content() # extract text

我將您的任務分為兩個部分:

  • 獲取頁面(包括由javascript生成的元素)
  • 提取文字

該代碼僅通過緩存連接。 您可以在一個過程中獲取頁面,而在另一個過程中提取文本,或推遲以后使用另一種算法進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM