python-2.7 - 如何通过从下拉选项中选择一个值而不使用 Selenium 来获取数据

标签 python-2.7 xpath web-scraping python-requests lxml.html

我需要从此页面获取所有 URL -
http://www.questdiagnostics.com/testcenter/BUSearch.action?submitValue=BUSearch&keyword=Toxoplasma+Abs+IgG+%2F+IgM
每当我从下拉列表中选择一个值并单击 go 按钮时。

我使用 xpath 从下拉选项中选择了一个值。但我不能点击去按钮。

我的代码是:

import requests
from lxml.html import fromstring
req = requests.get('http://www.questdiagnostics.com/testcenter/BUSearch.action?submitValue=BUSearch&keyword=Toxoplasma+Abs+IgG+%2F+IgM') 
hdoc = lxml.html.fromstring(req.content)
hdoc.xpath('//select[@id="labs"]/option/text()') 

如何在不使用 Selenium 的情况下获取所有链接?

最佳答案

正常使用案例
lxml是一个很棒的图书馆,它对填写和提交表格有很好的支持,as documented here .这个特定用例的真正挑战在于表单的工作方式。

区域实验室选择框不是表格的一部分;它的值是用 cookie 提交的。这使事情变得更加困难。

如果不是这种情况,您可以发出 GET ,从中拉出表单,更改您感兴趣的值,提交它,然后检查返回的链接。该脚本可能如下所示:

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')

而调用lxml.html.submit_form()时可以添加任意请求参数,我看不到添加任意cookie的方法。

此用例

也就是说,由于此表单本质上是通过重定向回自身来工作的(使用附加 cookie 来识别实验室),您可以通过将 cookie 添加到初始 GET 来模拟此行为。 .您可能根本不需要处理表单提交。此脚本将显示 SKB 实验室的前十个链接:
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)

您可以更进一步,发出 GET在没有 cookie 的情况下获取实验室列表,然后遍历该列表,调用 requests.get()在每一个上,发送适当的TC11SelectedLabCode cookie 来模拟表单提交。

备注

请注意,虽然 lxml有不错的表单提交支持,你实际上并没有点击任何东西。没有什么可以“为 DOM 注入(inject)活力”。
页面上的所有 javascript 都没有运行。

为了说明为什么这很重要,请考虑这个例子。如果您想验证结果第 2 页上的链接,我无法说明您将如何完成该操作。如果您的测试需要在页面上使用 javascript,我认为您需要的不仅仅是 requestslxml .

关于python-2.7 - 如何通过从下拉选项中选择一个值而不使用 Selenium 来获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47059069/

相关文章:

python - 构建分层字符串

python - 我误解了 Python 正则表达式吗?

python - 值错误 : Unable to configure handler 'file' : [Errno 13] Permission denied:

xml - XPath/XQuery - 选择一个节点同时排除一些元素

python - 提取文本 :after an element with Beautiful Soup

java - 从 Java 代码运行 Python 脚本

python - 将从浏览器获取的 XPath 转换为 Scrapy 可用的 XPath

xslt 变量 xpath 表达式

Python HTML 表格抓取(打印)

R httr 认证后下载在交互模式下工作但功能失败