繁体   English   中英

填写表格后抓取网页

[英]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检索数据,其中传递的参数modezip ,一个有效的示例:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM