我试图使用预先填充的拉链来抓取对此网站的回复: 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')仍然不存在。如果你有想法让这个工作(希望有一些简单的请求和lxml),那将是最好的。
答案 0 :(得分:1)
您无法在HTML中找到此数据的原因是它是使用脚本动态生成的。如果查看HTML中的第一个脚本,您将看到一个名为getData
的函数,其中包含您想要的数据。另一个脚本稍后使用此功能来构建您在浏览器中看到的内容。
因此,要抓取这些数据,我只需直接从脚本中提取它:获取函数返回的字符串,将其拆分为,
,依此类推。
答案 1 :(得分:1)
数据位于脚本标记内,您可以使用正则表达式进行解析但是您的方法无法在scrapy或使用请求中工作,页面上没有任何内容,使用 get <检索数据/ em> params 传递的地方是模式和 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)
答案 2 :(得分:0)
感谢以及之前的两个答案,一个功能齐全的解决方案如下:
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(',')