![](/img/trans.png)
[英]How to get visible text from a webpage using Selenium & python?
[英]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
我將您的任務分為兩個部分:
該代碼僅通過緩存連接。 您可以在一個過程中獲取頁面,而在另一個過程中提取文本,或推遲以后使用另一種算法進行處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.