如何使用Python和BeautifulSoup从嵌套HTML标签中提取href链接?
如何从BeautifulSoup结果中正确提取分页href链接?
我来帮你捋清楚问题出在哪,以及怎么解决:
首先,分析你遇到的问题原因:
- 直接调用
pagesize_content.ul.li.a['href']报错:因为soup.find_all()返回的是一个元素列表(你输出里能看到有两个div.pull-right),列表不能直接访问ul这类属性。而且第一个div是按钮组,根本没有ul,只有第二个div才是分页组件。 - 查找
class="fa fa-angle-double-right"的a标签返回空:这个class其实是属于<em>标签的,不是<a>标签的class,所以自然找不到。
解决方案:先定位到正确的分页div,再提取链接
方法1:精准定位分页div(推荐)
直接找包含ul.pagination的那个div.pull-right,避免依赖索引:
from bs4 import BeautifulSoup as bs soup = bs(html, 'html.parser') # 定位到包含分页ul的div pagination_div = soup.find('div', class_='pull-right', ul={'class': 'pagination'}) # 提取所有有效的分页href(排除javascript链接) all_page_links = [a['href'] for a in pagination_div.find_all('a', href=True) if not a['href'].startswith('javascript')] print(all_page_links) # 输出:['/Test/country?page=1', '/Test/country?page=2', '/Test/country?page=3', '/Test/country?page=4', '/Test/country?page=4']
方法2:从find_all结果中取目标div
如果你确定分页div是第二个,可以直接取列表索引[1]:
pagesize_content = soup.find_all('div', class_="pull-right") pagination_div = pagesize_content[1] # 同样提取所有链接 all_page_links = [a['href'] for a in pagination_div.find_all('a', href=True) if 'javascript' not in a['href']] print(all_page_links)
如果你只想提取「最后一页」的链接
可以通过文本内容或em标签来定位:
# 方法A:通过"Last"文本定位 last_link = pagination_div.find('li', text=lambda t: t and 'Last' in t.strip()).a['href'] # 方法B:通过em标签的class定位(因为Last按钮里的em有fa-angle-double-right类) last_link = pagination_div.find('em', class_='fa fa-angle-double-right').parent['href'] print(last_link) # 输出:/Test/country?page=4
内容的提问来源于stack exchange,提问作者thangaraj1980




