1

私は初心者のPythonプログラマーであり、Python2.7でSeleniumプロジェクトに取り組んでいます。

私は一般的なスクレーパースクリプトを持っています。これは基本的に、アクセスするすべてのWebサイトで何をしたいのかを概説しています。ただし、取得したいデータの性質上、各サイトで同じコードを実行することはできません。各サイトは、独自の個別のコードを実行する必要があります。

私はifステートメントの内部をインポートすることによってこれを解決しようとしました、そしてこれは私が思いついた解決策です:

site = False
if source_website == "Website A":
    from website_a import *
    site = True
elif source_website == "Website B":
    from website_b import *
    site = True
else:
    print "This is not an acceptable website!"

if site == True:
    # main code block
    driver = driver_setup(chrome)
    driver.get(source_website_URL)
    stuff_to_save = do_some_stuff(driver)
    xml_file(stuff_to_save)
    driver.quit()

ここで、モジュールwebsite_awebsite_bモジュールは両方とも、という名前の関数を持っておりdo_some_stuff、それらがアクセスしているWebサイトに固有の処理を実行します。さて、これはほとんどの場合うまくいくようです。website_cまた、関数を使用して呼び出されるモジュールをプログラムしdo_some_stuff、それを条件付きインポートに追加することを考えると、機能を任意の数のWebサイトに拡張できるようです。

だから、私の質問は、これは良い考えですか?このようなことをするためのより良い方法はありますか?

私は文字通り、このようなifステートメントの中にimportステートメントをラップする人を見たことがありません-そして一般的に、誰もそれをしていないようであれば、通常は正当な理由があります。

4

2 に答える 2

2

一般に、from somewhere import *名前空間の汚染のため、これは良い考えではありません。別々のモジュールでWebサイト固有のコードが必要な場合は、次のようなことをしてみませんか。

import importlib

website_modules = {'Website A': 'website_a', 'Website B': 'website_b'}

# ...

website = importlib.import_module(website_modules[source_website])

# use with website.function_name
于 2012-07-31T21:32:36.170 に答える
1

ページオブジェクトモデルパターン(http://code.google.com/p/selenium/wiki/PageObjects)を調べます。各ページを一意のエンティティとしてモデル化し、表示するページタイプを決定するロジックを用意し(明示的に指定するか、URLとページのコンテンツを検査することで暗黙的に)、キャプチャするメソッドを公開する必要があります。 Webdriverインスタンスを直接操作するのではなく、これらのオブジェクトに必要なデータ。最終的には次のようなものを目指す必要があります。

for page_identifier in ['page1', 'page2', 'page3']:
    page = navigate_to(page_identifier)
    extracted_data = page.get_data()
    xml_file.write(extracted_data)
于 2012-07-31T21:44:57.640 に答える