You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用BeautifulSoup从AUR网站提取软件包源文件名?

问题:使用BeautifulSoup提取a标签文本失败

需要从网页的特定a标签中提取文本内容iwgtk-0.8.tar.gz,目标a标签结构如下:

<a href="https://github.com/J-Lentz/iwgtk/archive/v0.8.tar.gz">iwgtk-0.8.tar.gz</a>

对应的网页结构片段:

<div>
    <ul id="pkgsrcslist">
        <li>
            <a href="https://github.com/J-Lentz/iwgtk/archive/v0.8.tar.gz">iwgtk-0.8.tar.gz</a>
        </li>
    </ul>
</div>

原代码

#!/usr/bin/env python3

from bs4 import BeautifulSoup
import requests

url="https://aur.archlinux.org/packages/iwgtk"
#url=sys.argv[1]

page = requests.get(url)
if page.status_code ==200:
    soup = BeautifulSoup(page.text, 'html.parser')
    urls = []
# loop over the [li] tags
    for tag in soup.find_all('li'):
        atag = tag.find('a')
        try:
            if 'href' in atag.attrs:
                url = atag.get('href').contents[0]
                urls.append(url)
        except:
            pass

# print all the urls stored in the urls list
for url in urls:
    print(url)

错误原因

atag.get('href')返回的是字符串类型的链接地址,字符串没有contents属性,这是代码报错的核心原因。另外atag.get('a')属于错误用法,get()方法用于获取标签属性,而非子标签。

修正方案

方案1:修复原逻辑,正确获取文本

替换错误行,直接获取a标签的文本内容,同时优化判断逻辑:

#!/usr/bin/env python3

from bs4 import BeautifulSoup
import requests

url="https://aur.archlinux.org/packages/iwgtk"

page = requests.get(url)
if page.status_code ==200:
    soup = BeautifulSoup(page.text, 'html.parser')
    filenames = []
    # 遍历li标签下的a标签
    for tag in soup.find_all('li'):
        atag = tag.find('a')
        if atag and 'href' in atag.attrs:
            # 获取a标签文本,strip=True去除前后空白
            filename = atag.get_text(strip=True)
            filenames.append(filename)

for filename in filenames:
    print(filename)

方案2:精准定位目标元素,提升效率

利用目标ul标签的idpkgsrcslist直接定位,避免遍历所有li标签:

#!/usr/bin/env python3

from bs4 import BeautifulSoup
import requests

url="https://aur.archlinux.org/packages/iwgtk"

page = requests.get(url)
if page.status_code ==200:
    soup = BeautifulSoup(page.text, 'html.parser')
    # 直接找到目标ul
    pkgsrc_list = soup.find('ul', id='pkgsrcslist')
    if pkgsrc_list:
        # 获取ul下所有a标签并提取文本
        for atag in pkgsrc_list.find_all('a'):
            print(atag.get_text(strip=True))

关键知识点

  • atag.get_text(strip=True):获取标签内文本,strip=True可清理文本前后的空白字符
  • soup.find('ul', id='pkgsrcslist'):通过标签id精准定位元素,比全局遍历更高效
  • atag.get('href'):返回字符串类型的链接地址,不能对其调用contents等标签专属属性

内容的提问来源于stack exchange,提问作者user1375531

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:01:15