【发布时间】:2020-05-26 12:37:11
【问题描述】:
我正在尝试使用 python 脚本解析从网页中遍历多个页面的名称。通过我目前的尝试,我可以从它的登录页面获取名称。但是,我找不到使用请求和 BeautifulSoup 从下一页获取名称的任何想法。
到目前为止我的尝试:
import requests
from bs4 import BeautifulSoup
url = "https://proximity.niceic.com/mainform.aspx?PostCode=YO95"
with requests.Session() as s:
r = s.get(url)
soup = BeautifulSoup(r.text,"lxml")
for elem in soup.select("table#gvContractors tr:has([id*='_lblName'])"):
name = elem.select_one("span[id*='_lblName']").get_text(strip=True)
print(name)
我尝试修改我的脚本以仅从第二页获取内容,以确保它在涉及下一页按钮时正常工作,但不幸的是它仍然从第一页获取数据:
import requests
from bs4 import BeautifulSoup
url = "https://proximity.niceic.com/mainform.aspx?PostCode=YO95"
with requests.Session() as s:
r = s.get(url)
soup = BeautifulSoup(r.text,"lxml")
payload = {i['name']:i.get('value','') for i in soup.select('input[name]')}
payload['__EVENTARGUMENT'] = 'Page$Next'
payload.pop('btnClose')
payload.pop('btnMapClose')
res = s.post(url,data=payload,headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36',
'X-Requested-With':'XMLHttpRequest',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'https://proximity.niceic.com/mainform.aspx?PostCode=YO95',
})
sauce = BeautifulSoup(res.text,"lxml")
for elem in sauce.select("table#gvContractors tr:has([id*='_lblName'])"):
name = elem.select_one("span[id*='_lblName']").get_text(strip=True)
print(name)
【问题讨论】:
-
您可以获取到下一个页面url的链接并发出下一个请求
-
这是一个不变的网址,所以我怀疑是否有任何下一页网址具有不同的外观@Eternal。
-
我检查了网站,似乎分页是 javascript 驱动的。您需要找到一种方法来单击下一步按钮。也许使用硒
-
我使用了 selenium 并取得了成功。开始单击下一页按钮以从下一页获取内容是一个旧消息。但是,我创建这篇文章是为了找到任何使用 requests 模块和 BeautifulSoup 库的解决方案。谢谢。
-
如果有使用 javascript 和严重依赖 javascript 的网站执行的操作,那么几乎不可能这样做。但是,您可以检查网站并分析网络选项卡以查看正在进行的 ajax 调用。或者,如果幸运的话,您将能够找到 API。
标签: python python-3.x web-scraping beautifulsoup http-post