【问题标题】:How to scrape an element from a website which belongs to more than one class using BeautifulSoup如何使用 BeautifulSoup 从属于多个类的网站中抓取元素
【发布时间】:2020-12-26 21:15:19
【问题描述】:

我正在尝试从网站上抓取元素。

<h2 class="a b" data-test-search-result-header-title> Heading </h2>

如何使用 BeautifulSoup 从网站中提取值 Heading?

我尝试了以下代码:

代码 1:

soup.find_all(h2,{'class':['a','b']})

代码 2:

soup.find_all(h2,class_='a b'})

这两个代码都返回一个空列表。 如何解决?

【问题讨论】:

  • 多个类名永远不会让你得到元素。你有什么别的办法查吗?除了类名?
  • a relevant thread 中,有人建议使用CSS 选择器,如soup.select("h2.a.b")
  • Code 1 给了我这个元素。但它也提供了 class="a"class="b" 的元素
  • 这能回答你的问题吗? BeautifulSoup findAll() given multiple classes?
  • @Prayson W. Daniel 在那个问题中,问题是属于任何一个类。在这种情况下,元素应该属于两个类

标签: python web-scraping beautifulsoup


【解决方案1】:

尝试将code2修复为soup.find_all('h2',class_='a b')

示例:

给定四个 h2 标记及其类,soup.find_all('h2',class_='a b') 获取其中的第一个,因为它与过滤器匹配。

要获得h2 元素的text 使用.text,我已经做到了

[heading.text for heading in soup.find_all('h2',class_='a b')]

因为我们必须循环 find_all() 结果。

from bs4 import BeautifulSoup

html = """
<h2 class="a b"> Heading a and b </h2>
<h2 class="b a"> Heading b and a </h2>
<h2 class="a"> Heading a </h2>
<h2 class="b"> Heading b </h2>
"""

soup=BeautifulSoup(html,'html.parser')

[heading.text for heading in soup.find_all('h2',class_='a b')]

输出

[' Heading a and b ']

进一步的想法

您说它对您不起作用 - 如果不提​​供进一步的代码/信息,很难提供帮助和更多的猜测。让我告诉你什么也可能是一个原因:

假设您正在抓取google results,有很多选择可以做到这一点,我只想展示两种方法requestsselenium

请求示例

在浏览器中检查h3 的类是LC20lb DKV0Md

import requests
from bs4 import BeautifulSoup

r = requests.get('https://www.google.com/search?q=stackoverflow')
soup = BeautifulSoup(r.content, 'lxml')
headingsH3Class = soup.find_all('h3', class_='LC20lb DKV0Md')
headingsH3Only = soup.find_all('h3')

print(headingsH3Class[:2])
print(headingsH3Only[:2],'\n')

请求示例输出

  • 一个空列表

    []

  • 显示检查的类不在页面内容中的列表,我们通过请求返回

_

[<h3 class="zBAuLc"><div class="BNeawe vvjwJb AP7Wnd">Stack Overflow</div></h3>, <h3 class="zBAuLc"><div class="BNeawe vvjwJb AP7Wnd">Stack Overflow (Website) – Wikipedia</div></h3>]

硒示例

from selenium import webdriver
from bs4 import BeautifulSoup

url = 'https://www.google.com/search?q=stackoverflow'

browser = webdriver.Chrome(executable_path=r'C:\Program Files\ChromeDriver\chromedriver.exe')
browser.get(url)

soup = BeautifulSoup(browser.page_source, 'lxml')
headingsH3Class = soup.find_all('h3', class_='LC20lb DKV0Md')
headingsH3Only = soup.find_all('h3')

print(headingsH3Class[:2])
print(headingsH3Only[:2])
browser.close()

Selenium 示例输出

  • 一个包含 h3 的列表,其中包含我们搜索的两个类。

_

[<h3 class="LC20lb DKV0Md"><span>Stack Overflow - Where Developers Learn, Share, &amp; Build ...</span></h3>, <h3 class="LC20lb DKV0Md"><span>Stack Overflow (Website) – Wikipedia</span></h3>]
  • 包含所有 h3 元素的列表

_

[<h3 class="LC20lb DKV0Md"><span>Stack Overflow - Where Developers Learn, Share, &amp; Build ...</span></h3>, <h3 class="r"><a class="l" data-ved="2ahUKEwj426uv9u3tAhUPohQKHYymBMAQjBAwAXoECAcQAQ" href="https://stackoverflow.com/questions" ping="/url?sa=t&amp;source=web&amp;rct=j&amp;url=https://stackoverflow.com/questions&amp;amp;ved=2ahUKEwj426uv9u3tAhUPohQKHYymBMAQjBAwAXoECAcQAQ">Questions</a></h3>]

结论

始终检查您正在抓取的数据,导致响应和浏览器中检查的内容可能不同。

【讨论】:

  • 我试过了。它还返回一个空列表
  • 请您提供网站的网址或Minimal, Reproducible Example
  • 哇,你跑得更远了
  • 度过了愉快的一天 ;) - 这是问答中通常不包含详细信息的内容,很遗憾,但非常感谢您看到并欣赏它。
猜你喜欢
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 2021-03-11
  • 2023-03-09
相关资源
最近更新 更多