我尝试向this site发送POST请求以在其数据库中执行搜索,但它只返回相同的页面,而不是我正在寻找的页面。如果我尝试访问该网站,搜索会导致我的参数,它会拒绝我的请求。我觉得我错过了一些东西,也许有人可以帮助我。
import urllib.request
from bs4 import BeautifulSoup
DATA = urllib.parse.urlencode({'plz_ff': 50000, 'plz_ff2': 50030})
DATA = DATA.encode('utf-8')
request = urllib.request.Request("http://www.altenheim-adressen.de/schnellsuche/index.cfm", 'POST')
# adding charset parameter to the Content-Type header.
request.add_header("text/html;charset=UTF-8","application/x-www-form-urlencoded;charset=utf-8Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0")
f = urllib.request.urlopen(request, DATA)
soup = BeautifulSoup(f)
print(soup.prettify)
f.close()
soup.close
EDIT2:“守则”现在有效,非常感谢。我必须将搜索参数调整为地址suche1.cfm
,现在它会返回我正在寻找的结果。这是成品:
import urllib.request
from bs4 import BeautifulSoup
params = {
'name_ff': '',
'strasse_ff': '',
'plz_ff': 50000,
'plz_ff2': 50030,
'ort_ff': '',
'bundesland_ff': '',
'land_ff': '',
'traeger_ff': '',
'Dachverband_ff': '',
'submit2' : 'Suchen'
}
DATA = urllib.parse.urlencode(params)
DATA = DATA.encode('utf-8')
request = urllib.request.Request(
"http://www.altenheim-adressen.de/schnellsuche/suche1.cfm",
DATA)
# adding charset parameter to the Content-Type header.
request.add_header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
request.add_header("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0")
f = urllib.request.urlopen(request)
soup = BeautifulSoup(f)
print(soup.prettify)
f.close()
答案 0 :(得分:1)
您需要将DATA
添加到Request
对象;您现在正在发送文本'POST'
作为帖子正文。
正确的方法是:
request = urllib.request.Request(
"http://www.altenheim-adressen.de/schnellsuche/index.cfm",
DATA)
# adding charset parameter to the Content-Type header.
request.add_header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
request.add_header("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0")
f = urllib.request.urlopen(request)
请注意,我还在那里添加了 User-Agent 和 Content-Type 标头;无论你添加什么都不是一个可识别的标题。
我注意到此页面上的2个表单使用不同的目标;既不发布到index.cfm
:
>>> for form in soup.find_all('form'):
... print(form.attrs.get('action'))
...
suche1.cfm
suche1b.cfm
因此,如果您希望使用其中一种表单,则需要在此处使用正确的目标网址。您还需要验证您的POST表单字段;我看到发布到suche1b.cfm
的表单包含类似的表单字段,但它们使用plz_ffb
和plz_ff2b
,而不是plz_ff
和{{1} }。
您可能还想发送所有表单字段,即使是空字符串:
plz_ffb