python - 无法使用请求从网页获取所有表格内容

标签 python python-3.x web-scraping

我用 python 创建了一个脚本来解析网站中的表格内容。我的脚本现在可以解析其登陆页面的内容。但是,该页面底部有一个 NEXT PAGE 按钮,单击后会展开 50 多个结果,依此类推。

Website address

我尝试过(抓取前 50 个结果):

import requests
from bs4 import BeautifulSoup

site_link = 'https://indiarailinfo.com/trains/passenger/0/0/0/0'

res = requests.get(site_link)
soup = BeautifulSoup(res.text,"lxml")
for items in soup.select("div[style='line-height:20px;']"):
    tds = [elem.get_text(strip=True) for elem in items.select("div")]
    print(tds)

如何使用请求耗尽下一页按钮从该页面获取所有表格内容?

PS我知道如何使用selenium展开内容,所以与任何浏览器模拟器相关的解决方案不是我想要的。

最佳答案

点击下一步按钮实际上是对https://indiarailinfo.com/trains/passenger/0/1?i=1&&kkk=1571329558457进行XHR操作

<button class="nextbtn" onclick="javascript:getNextTrainListPageBare($(this).parent(),'/trains/passenger/0/1?i=1&amp;');"><div>NEXT PAGE<br>the next 50 Trains will appear below</div></button>

因此,您所要做的就是获取“onclick”下的数据,编写一个 url 并使用请求执行 HTTP GET。

返回的数据将如下所示

https://pastebin.com/Nk0E5vHH

现在只需使用 BeautifulSoup 并提取您需要的数据。

下面的代码(将 10 替换为您需要的数字)

import requests
from bs4 import BeautifulSoup

site_link = 'https://indiarailinfo.com/trains/passenger/0/{}'

for x in range(10):
    url = site_link.format(x)
    res = requests.get(url)
    soup = BeautifulSoup(res.text,"lxml")
    print('Data for url: {}'.format(url))
    for items in soup.select("div[style='line-height:20px;']"):
        tds = [elem.get_text(strip=True) for elem in items.select("div")]
        print(tds)

关于python - 无法使用请求从网页获取所有表格内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58436669/

相关文章:

python - 使用 .format() 打印可变字符串和四舍五入的数字

python - 是否可以在没有换行或空格的情况下打印?

python - 通过猴子修补 DEFAULT_PROTOCOL 提高 pickle.dumps 的性能?

python-3.x - Astropy:确定一个点(RA,DEC)是否在给定该区域角坐标的方形区域内

java - Jsoup选择不同的Div类型并依次处理

python - 如何通过Selenium从网站上抓取产品名称?

python - Azure func 在使用 Core Tools 4.0.5030 的 M1 Mac 上启动失败

python - 将 numpy 数组与单个值进行比较

python-3.x - 无法使用带有标记为索引的字符串的 loc 进行设置

r - 使用 SelectorGadget 抓取网页