Beautiful Soup 错误 - 没有“看到”整个网页?

-1 投票
1 回答
1046 浏览
提问于 2025-05-01 15:03

我想从这个加拿大统计局网页上抓取一些简单的链接。我想获取所有类名为“indent-3”的链接,并且这些链接的类型是li。我以为我可以用下面的代码来实现:

import httplib2
from bs4 import BeautifulSoup, SoupStrainer

#stats canada webpage
base_page = ("http://www12.statcan.gc.ca/census-recensement/2006/dp-pd/tbt/Geo-index-eng.cfm?TABID=5&LANG=E&APATH=3&DETAIL=0&DIM=0&FL=A&FREE=0&GC=0&GID=0&GK=0&GRP=1&PID=99015&PRID=0&PTYPE=88971,97154&S=0&SHOWALL=0&SUB=0&Temporal=2006&THEME=70&VID=0&VNAMEE=&VNAMEF=&D1=0&D2=0&D3=0&D4=0&D5=0&D6=0")

http = httplib2.Http()
status, response = http.request(base_page) 
soup = BeautifulSoup(response)

links = soup.find_all("li", class_="indent-3")

但是当我运行这段代码时,得到的链接列表长度是13,而应该是288。然后我又做了

soup.get_text()

结果是,soup只从网页的很小一部分提取了文本,最多只到第428条的Brackley。

我为什么没有获取到网页的大部分内容呢?

补充:因为看起来BeautifulSoup不是问题,我尝试把网页的html文件保存为webfile.html。然后我直接把它读入Python。

f = file("webfile.html", 'r')
page = f.read()
soup = BeautifulSoup(page)
links = soup.find_all("li", class_="indent-3")

但我仍然只得到了13个链接。我不知道我哪里做错了……

暂无标签

1 个回答

0

这不是关于BeautifulSoup的,而是你发出的请求。

我使用了requests库,并且提供了User-Agent这个头信息,这样就成功了:

import requests
from bs4 import BeautifulSoup

#stats canada webpage
base_page = "http://www12.statcan.gc.ca/census-recensement/2006/dp-pd/tbt/Geo-index-eng.cfm?TABID=5&LANG=E&APATH=3&DETAIL=0&DIM=0&FL=A&FREE=0&GC=0&GID=0&GK=0&GRP=1&PID=99015&PRID=0&PTYPE=88971,97154&S=0&SHOWALL=0&SUB=0&Temporal=2006&THEME=70&VID=0&VNAMEE=&VNAMEF=&D1=0&D2=0&D3=0&D4=0&D5=0&D6=0"

response = requests.get(base_page, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36'})
soup = BeautifulSoup(response.content)

links = soup.find_all("li", class_="indent-3")
print len(links)  # prints 288

撰写回答