【问题标题】:How to extract specific information from a webpage using BeautifulSoup如何使用 BeautifulSoup 从网页中提取特定信息
【发布时间】:2023-01-03 00:55:24
【问题描述】:

我正在使用 BeautifulSoup 来提取这一行:

<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>

具体来说,我想要这部分:iwgtk-0.8.tar.gz

我写了这段代码:

#!/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)

我认为是这条线

url = atag.get('href').contents[0]

那失败了。我试过了

url = atag.get('a').contents[0]

但那也失败了。

【问题讨论】:

  • 你说想要这个部分:iwgtk-0.8.tar.gz 但试图提取href,那是不一样的。所以您需要hrefs 或链接文本?

标签: python beautifulsoup


【解决方案1】:

尝试选择更具体的元素:

soup.find('ul',{'id':'pkgsrcslist'}).find_all('a')

或通过css selector更舒服

soup.select('#pkgsrcslist a')

并使用 get('href') 获取 url 或 text / get_text() 获取其文本或同时使用两者并将其作为键值存储在 dict 中:

...
soup = BeautifulSoup(page.text, 'html.parser')
pkgs = {}

for tag in soup.select('#pkgsrcslist a'):
    print('url: ' +tag.get('href'))
    print('text: ' + tag.text)
    ### update your a dict of package versions and links
    pkgs.update({
        tag.text:tag.get('href')
    })

例子

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')
    pkgs = {}
    for tag in soup.select('#pkgsrcslist a'):
        pkgs.update({
            tag.text:tag.get('href')
        })

print(pkgs)

输出

{'iwgtk-0.8.tar.gz': 'https://github.com/J-Lentz/iwgtk/archive/v0.8.tar.gz'}

【讨论】:

  • 这里重要的是CSS-selector#pkgsrcslist a,它选择了id为pkgsrcslist的元素内的所有链接(标签a)。它可以与select方法一起使用,而不是findfind_all
【解决方案2】:

您还可以使用 search 类型和 arg 搜索词使用官方 Aurweb RPC interface 查询 AUR 存储库:

https://aur.archlinux.org/rpc/?v=5&type=search&arg=iwgtk

它默认返回 JSON:

{
  "resultcount": 1,
  "results": [
    {
      "Description": "Lightweight wireless network management GUI (front-end for iwd)",
      "FirstSubmitted": 1597306328,
      "ID": 1124939,
      "LastModified": 1660234078,
      "Maintainer": "J-Lentz",
      "Name": "iwgtk",
      "NumVotes": 19,
      "OutOfDate": null,
      "PackageBase": "iwgtk",
      "PackageBaseID": 156689,
      "Popularity": 1.748972,
      "URL": "https://github.com/J-Lentz/iwgtk",
      "URLPath": "/cgit/aur.git/snapshot/iwgtk.tar.gz",
      "Version": "0.8-2"
    }
  ],
  "type": "search",
  "version": 5
}

你想要的信息可以在 JSON-path .results[].URLPath 找到。

【讨论】:

    猜你喜欢
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多