python - 使用 BeautifulSoup 进行 Web 抓取 - 无法提取表行
问题描述
我正在尝试使用 BeautifulSoup 在以下网页上提取表格:
https://www.indiapost.gov.in/VAS/Pages/PMODashboard/DistributionOfPostOffices.aspx
我尝试使用的代码是:
import pandas as pd
from urllib.request import urlopen
from bs4 import BeautifulSoup
url = "https://www.indiapost.gov.in/VAS/Pages/PMODashboard/DistributionOfPostOffices.aspx"
html = urlopen(url)
soup = BeautifulSoup(html, 'lxml')
type(soup)
table = soup.find('table', {'class' : 'tbl'})
#extract rows:
rows = soup.find_all('tr')
的最后一行应该打印带有 HTML 标记的行名的输出(即 Sl No.、Head Post Office 等),但它仅打印一个空列表。我哪里错了?
解决方案
您可能希望遵循以下方法来使用请求从该网页获取表格内容。事实证明,您可以在此链接中找到您要查找的内容,您可以使用 chrome 开发工具找到该链接。
工作代码:
import csv
import requests
from bs4 import BeautifulSoup
url = 'https://www.indiapost.gov.in/Documents/DashboardXmlFile/DashboardXML.xml'
def get_tabular_info(link):
r = requests.get(link)
soup = BeautifulSoup(r.text,'xml')
tabular_list = []
for items in soup.select("DistributionOfPostOffices Table1")[2:]:
tabular_list.append([item.get_text(strip=True) for item in items.select("A,B,C,D,E,F")])
return tabular_list
if __name__ == '__main__':
with open("output_indiapost.csv","w",newline="") as f:
writer = csv.writer(f)
for item in get_tabular_info(url):
writer.writerow(item)
print(item)
输出如下:
['Sl. No.', 'Circle Name', 'Head Post Office', 'Sub Post Office', 'Branch Post Office', 'Letter Box']
['1', 'Andhra Pradesh Circle', '59', '1535', '8897', '29510']
['2', 'Assam Circle', '19', '606', '3385', '12427']
['3', 'Bihar Circle', '32', '1029', '8031', '22433']
['4', 'Chhattisgarh Circle', '11', '341', '3079', '14988']
['5', 'Delhi Circle', '12', '406', '142', '1187']
['6', 'Gujarat Circle', '33', '1243', '7651', '24377']
推荐阅读
- html - 同时改变宽度、高度和变换会导致奇怪的过渡
- c++ - Visual Studio 代码看不到 boost 库
- gremlin - Gremlin:如何使用 math() 过滤遍历结果?
- spring - MAP 和 Web 服务之间的区别
- r - 如何使用 dplyr 查找列在一行中的排名?
- android-studio - Gradle 同步失败。修复了编码,但构建失败
- jmeter - 在 jmeter post 方法中抛出状态 500 内部错误,同样需要完整的数据
- c# - EF Core 在添加带有种子数据的迁移时返回 Stackoverflow
- php - PHP关联数组使用变量作为键
- linux - MongoDb 不启动 Amazon Linux