【问题标题】:BeautifulSoup scrape tags with same class nameBeautifulSoup 抓取具有相同类名的标签
【发布时间】:2023-04-08 17:30:01
【问题描述】:

我是 BeautifulSoup 的新手。我正在使用 Python 和 bs 进行一些网络抓取,并且我有两个具有相同类名的段落。 HTML如下:

<p class='metadata'>Wed 1 Jan 2020 00:01 GMT</p><p class='metadata'>Category: <span>UK-News</span></p>

我正在尝试仅获取跨度标签 (UK-News) 中的类别名称。我正在使用循环,因为我正在抓取多篇文章。以下是我尝试过的一些事情:

articles = soup.find_all('div', {'class' : 'article'})

for item in articles:
    #category = item.find('span') - prints out the same date 
    #category = item.find('p', {'class' : 'metadata'}).text - prints every span tag in html
    #category = item.find('p', {'class' : 'metadata'}) - prints only the dates
    category = soup.select_one('span').get_text #prints out the same category name
    print(category)

这可能是一个小修复,但它真的让我很头疼,因为我觉得我已经尝试了所有方法。提前致谢。

【问题讨论】:

  • articles 来自哪里,它是什么样的?还是只是一个 URL 列表?
  • 尝试使用 CSS 选择器,例如 soup.select('p.metadata > span')
  • @Boris 哎呀,忘了包括那个。将更新代码。每篇文章都有自己的 div,所以我正在搜索每个文章 div 中的标签。我尝试了 css 选择器,它正在工作,但打印出每个类别名称 51 次(有 51 篇文章)。不过,我会对此进行更多的研究,谢谢!

标签: python web-scraping beautifulsoup


【解决方案1】:

您正在循环内的soup 中搜索。改成item.select_one:

from bs4 import BeautifulSoup


html_doc = """
<article>
<p class='metadata'>Wed 1 Jan 2020 00:01 GMT</p>
<p class='metadata'>Category: <span>UK-News</span></p>
</article>

<article>
<p class='metadata'>Wed 2 Jan 2020 00:01 GMT</p>
<p class='metadata'>Category: <span>World-News</span></p>
</article>"""

soup = BeautifulSoup(html_doc, "html.parser")

articles = soup.find_all("article")
for item in articles:
    category = item.select_one("p.metadata span").text  # <-- use item.select
    print(category)

打印:

UK-News
World-News

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多