[英]Scrape webpage after form fill
我正在尝试使用预先填充的zip抓取对该网站的回复: zip who (即,邮政编码已经填写。)我尝试使用scrapy shell进行此操作,如下所示
scrapy shell http://zipwho.com/?zip=77098&mode=zip
但响应中不包含填写表单的页面,而仅包含zipwho.com主页中的内容,而没有该邮政编码的特定详细信息。 我尝试使用请求和lxml填写表单信息,但显然我做错了。
import requests
import lxml.html as lh
url = 'http://zipwho.com'
form_data = {
'zip': '77098'
}
response = requests.post(url, data=form_data)
tree = lh.document_fromstring(response.content)
tree.xpath('//td[@class="keysplit"]')
并且数据的表元素(td,其中class ='keysplit')仍然不存在。 如果您有想法使此工作正常进行(最好是使用诸如requests和lxml之类的简单方法),那将是最好的。
数据位于脚本标签中,您可以使用正则表达式对其进行解析,但是您的方法将无法正常运行或使用请求,没有任何内容发布至页面,使用get检索数据,其中传递的参数是mode和zip ,一个有效的示例:
import requests
import lxml.html as lh
import re
url = 'http://zipwho.com'
params = {
'zip': '77098',
"mode":"zip"
}
response = requests.get(url, params=params)
tree = lh.document_fromstring(response.content)
script = tree.xpath("/script[contains(., 'function getData()')]//text()")[0]
data = re.search('"(.*?)"', script).group(1)
您无法在HTML中找到此数据的原因是它是使用脚本动态生成的。 如果查看HTML中的第一个脚本,则会看到一个名为getData
的函数,其中包含所需的数据。 以后,另一个脚本使用此功能来构建您在浏览器中看到的内容。
因此,要抓取这些数据,我只是直接从脚本中提取它:获取函数返回的字符串,将其拆分为,
依此类推。
祝好运!
有了感谢和先前的两个回答,完整的解决方案如下:
url = 'http://zipwho.com/?zip=77098&mode=zip'
response = requests.post(url)
tree = lh.document_fromstring(response.content)
scriptText = tree.xpath("//script[contains(., 'function getData()')]")[0].text
splitVals = scriptText.split('"')[1].split('\\n')
if len(splitVals) >= 2:
headers =splitVals[0].split(',')
data = splitVals[1].split(',')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.