如何用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
相关产品推荐
相关产品推荐

