問題
次の質問があります。次のリンクを使用して会社に関する情報を検索する必要があります。
私がそれを行う必要があるのは、search by entity name
「search type
開始」ドロップダウン値であることです。Display number of items to view
また、その部分でページごとに「すべてのアイテム」を表示したいと思います。たとえば、「名前を入力してください」テキスト ボックスに「google」と入力すると、スクリプトは「google」で始まる名前の会社のリストを返すはずです (ただし、これは私がやりたいことの出発点にすぎません)。
質問: Python を使用してこれを行うにはどうすればよいですか? 次のスレッドを見つけました: Using Python to ask a web page to run search
最初の回答の例を試しました。コードを以下に示します。
from bs4 import BeautifulSoup as BS
import requests
protein='Q9D880'
text = requests.get('http://www.uniprot.org/uniprot/' + protein).text
soup = BS(text)
MGI = soup.find(name='a', onclick="UniProt.analytics('DR-lines', 'click', 'DR-MGI');").text
MGI = MGI[4:]
print protein +' - ' + MGI
上記のコードが機能するのは、これらのパラメーターを受け取る がUniPort
Web サイトに含まれているためです。analytics
しかし、私が使っているウェブサイトにはそれがありません。
また、このスレッドの最初の回答と同じことを試みました: how to submit query to .aspx page in python
ただし、最初の回答で提供されているコード例は、私のマシンでは機能しません(Ubuntu 12.4 with Python 2.7)。別のaspx Webサイトを扱っているため、どの値が必要かについても明確ではありません。
Python を使用して特定の基準で検索を開始するにはどうすればよいです か (これが適切な Web 用語であるかどうかわかりません。フォームを送信する可能性があります)。
私は C++ のバックグラウンドを持っており、Web のことは何もしていません。Pythonも学んでいます。どんな助けでも大歓迎です。
最初の編集:
@Kabieの多大な助けを借りて、次のコードを収集しました(それがどのように機能するかを理解しようとしています):
import requests
from lxml import etree
URL = 'http://corp.sec.state.ma.us/CorpWeb/CorpSearch/CorpSearch.aspx'
#With get_fields(), we fetched all <input>s from the form.
def get_fields():
res = requests.get(URL)
if res.ok:
page = etree.HTML(res.text)
fields = page.xpath('//form[@id="Form1"]//input')
return { e.attrib['name']: e.attrib.get('value', '') for e in fields }
#hard code some selects from the Form
def query(data):
formdata = get_fields()
formdata.update({
'ctl00$MainContent$ddRecordsPerPage':'25',
}) # Hardcode some <select> value
formdata.update(data)
res = requests.post(URL, formdata)
if res.ok:
page = etree.HTML(res.text)
return page.xpath('//table[@id="MainContent_SearchControl_grdSearchResultsEntity"]//tr')
def search_by_entity_name(entity_name, entity_search_type='B'):
return query({
'ctl00$MainContent$CorpSearch':'rdoByEntityName',
'ctl00$MainContent$txtEntityName': entity_name,
'ctl00$MainContent$ddBeginsWithEntityName': entity_search_type,
})
result = search_by_entity_name('google')
上記のコードは、 という名前のスクリプトに入れられquery.py
ます。次のエラーが発生しました。
トレースバック (最新の呼び出しが最後): ファイル "query.py"、39 行目、
結果 = search_by_entity_name('google')
ファイル "query.py"、36 行目、search_by_entity_name
'ctl00$MainContent$ddBeginsWithEntityName': entity_search_type、
ファイル「query.py」、行 21、クエリ
formdata.update({
AttributeError: 'NoneType' object has no attribute 'update'
検索がうまくいかないように思えますか?なんで?