通常のユースケース
lxml
は素晴らしいライブラリであり、それは記入し、フォーム、as documented hereを提出するためのまともなサポートしています。この特定のユースケースの実際の課題は、フォームが動作する方法に根ざしています。
地域ラボ選択ボックスはフォームの一部ではありません。その値はクッキーで送信されます。これは物事を少し難しくします。
これが当てはまらない場合は、GET
を発行してフォームを抜き出し、興味のある値を変更して送信し、戻ってくるリンクを調べてください。あなたがlxml.html.submit_form()
を呼び出すときに、私は任意のクッキーを追加する方法が表示されない、任意のリクエストパラメータを追加することができますが
req = requests.get('http://www.questdiagnostics.com/testcenter/BUSearch.action?submitValue=BUSearch&keyword=Toxoplasma+Abs+IgG+%2F+IgM')
hdoc = lxml.html.fromstring(req.content)
form = hdoc.forms[1]
# Set form inputs using `form.fields = dict(...)`
form.action = "http://www.questdiagnostics.com" + form.action
submitResult = lxml.html.parse(lxml.html.submit_form(form)).getroot()
links = submitResult.xpath('//*[@id="maincolumn"]/ol/li/a[@class="title"]/@href')
:このスクリプトは次のようになります。
このユースケース、本質的には、(ラボを識別するために、追加のクッキーで)自分自身に戻ってリダイレクトすることで動作します。このフォームは、あなたは自分の初期にクッキーを追加することで、この動作をシミュレートする可能性があるので、言っ
GET
。あなたは、フォーム提出でまったく混乱する必要はないかもしれません。呼び出し、あなたはさらに一歩これを取る、とラボのリストを取得していないクッキーとGET
を発行し、そのリストを反復処理することができ
cookies = dict(TC11SelectedLabCode='SKB')
req = requests.get('http://www.questdiagnostics.com/testcenter/BUSearch.action?submitValue=BUSearch&keyword=Toxoplasma+Abs+IgG+%2F+IgM', cookies=cookies)
hdoc = lxml.html.fromstring(req.content)
links = hdoc.xpath('//*[@id="maincolumn"]/ol/li/a[@class="title"]/@href')
print(links)
:このスクリプトは、SKBラボのための最初の10件のリンクが表示されますrequests.get()
それぞれに、適切なTC11SelectedLabCode
クッキーを送信してフォーム提出をシミュレートします。 lxml
はまともなフォームの送信をサポートしている一方で、あなたは実際には何もクリックしていないことを
ノート
注意。 DOMに "人生を呼吸する"ものは何もありません。 ページ上のjavascriptは実行されていません。
これがなぜ重要なのかを説明するために、この例を検討してください。結果の2ページ目のリンクを確認したい場合は、その結果をどのように達成するかは言えません。テストでページ上でJavaScriptを実行する必要がある場合は、requests
とlxml
以上が必要です。
ありがとう。それは私のために働いています。 –