1

我正在尝试使用 python 解析一系列 html 页面,但无法以迭代方式抓取页面。网页的链接。

米兰图书馆

在查看源代码后,我找到了一个响应下一页按钮元素上的单击事件的函数。

 function SaltaAPagina() {
    var CalcPag = VAIAPAGINA.value;
    if (CalcPag > 0) {
        CalcPag=CalcPag;
    }
    else {
        CalcPag="1";
     }
    document.location = "/OPACMI01/cat/SDW?W=CODICE_BIBLIO+%3D+%27LO1+01%27+AND+EDITORE+PH+WORDS+%27sonzogno%27+AND+DATA_PUBBLICAZIONE+%3C+1943+ORDER+BY+ORDINAMENTO/Ascend&M=" + CalcPag + "&R=Y";
    }

我知道我可以使用 urlencode 方法使用 pythons urllib2 模块对参数进行编码。但我不确定我应该包含什么作为参数

lomba_link='http://www.biblioteche.regione.lombardia.it/OPACMI01/cat/SDW?W%3DCODICE_BIBLIO+%3D+%27LO1+01%27+AND+EDITORE+PH+WORDS+%27sonzogno%27+AND+DATA_PUBBLICAZIONE+%3C+1943+ORDER+BY+ORDINAMENTO/Ascend%26M%3D1%26R%3DY'
params = urllib.urlencode([('CalcPag',4)])
# this has not worked.
req = urllib2.Request(lomba_link)
print req
response = urllib2.urlopen(req,params)
html_doc = response.read()

我在这里想念什么?

谢谢

4

2 回答 2

1

您发布的 javascript 函数将几个参数传递给目标页面:

document.location = "/OPACMI01/cat/SDW" + // This is the path of the page
     "?W=CODICE_BIBLIO+%3D+%27LO1+01%27+AND+EDITORE+PH+WORDS+%27sonzogno%27+AND+DATA_PUBBLICAZIONE+%3C+1943+ORDER+BY+ORDINAMENTO/Ascend" + // The first parameter
     "&M=" + CalcPag + // The second parameter
     "&R=Y"; // The third parameter

在您的代码中,您已经对 URL 中的所有&=符号进行了编码,因此您传递了一个没有值的单个长参数 - 将这些符号改回它们在 javascript 函数中的样子应该可以解决问题。

lomba_link='http://www.biblioteche.regione.lombardia.it/OPACMI01/cat/SDW'
params = urllib.urlencode([
    ('W', 'CODICE_BIBLIO+%3D+%27LO1+01%27+AND+EDITORE+PH+WORDS+%27sonzogno%27+AND+DATA_PUBBLICAZIONE+%3C+1943+ORDER+BY+ORDINAMENTO/Ascend'),
    ('M', 4),
    ('R', 'Y')
])
于 2012-11-09T01:46:24.043 回答
0

使用辉煌的图书馆要容易得多requests,而不是urllib2图书馆......

关于POST 请求urllib2.urlopenparams不幸的是,您需要将查询字符串附加到 url 以发出 GET 请求。

例如:

req = urllib2.urlopen(req + '?' + params)

有了请求,这会简单得多:

page = requests.get(some_url, params={'CalcPag': '4'})
于 2012-11-09T01:49:58.400 回答