如何使用 Python 在 bs4.ResultSet(列表)中找到字符串?

How can I find a string inside a bs4.ResultSet (list) using Python?

我正在尝试在 Facebook 广告库中自动搜索广告。为此,我使用了 Selenium 和 BeautifulSoup 来获取页面代码。

BeautifulSoup函数returns一个bs4.ResultSet与页面的HTML,据我了解,这是一个列表。

我正在尝试使用 soup.find_all 遍历该列表,对于找到的每个元素,我想测试看看里面有没有特定的字符串。

但实际上,我的代码没有按预期工作。 if 语句在 for 循环中 总是 returns False.

# Using chrome driver
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)

# Web page url request
driver.get('https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=BR&q=frete%20gr%C3%A1tis%20aproveite&sort_data[direction]=desc&sort_data[mode]=relevancy_monthly_grouped&search_type=keyword_unordered&media_type=all')
driver.maximize_window()
time.sleep(10)

# Webscraping with BeautifulSoup
soup = BeautifulSoup(driver.page_source, 'html.parser') 

ads_list = []
for tag in soup.find_all('div', class_='_99s5'):
    if 'qku1pbnj j8otv06s r05nras9 a1itoznt te7ihjl9 svz86pwt a53abz89' in str(tag):
        ads_list.append(tag)
    else:
        None

以下语句:

if 'qku1pbnj j8otv06s r05nras9 a1itoznt te7ihjl9 svz86pwt a53abz89' in str(tag)
当且仅当 'qku1pbnj j8otv06s r05nras9 a1itoznt te7ihjl9 svz86pwt a53abz89'str(tag) 的子字符串时,

才会 return True。我假设您更想检查 str(tag) 是否包含任何字符串 'qku1pbnj j8otv06s r05nras9 a1itoznt te7ihjl9 svz86pwt a53abz89'。所以它将是:

if any(e in str(tag) for e in 'qku1pbnj j8otv06s r05nras9 a1itoznt te7ihjl9 svz86pwt a53abz89'.split()):

如前所述,使用 classes 的策略并不是最好的,因为它们可能非常动态,因此最好坚持使用 id、标签或文本 - 但有时可能别无选择。

对于 select 只有带有 <span> 的卡片包含其已在广告中使用的信息,您可以使用 css selectors

下一行将搜索带有 class _99s5 的外部 <div>,其中包含包含您的文本的 <span> 并使用这些创建 ResultSet外部 <div>:

ads_list = soup.select('div._99s5:has(:-soup-contains("ads use this creative and text"))')

例子

注意: 您的 browser/driver 语言应该是英语,否则您必须更改您希望找到的文本。

driver.get('https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=BR&q=frete%20gr%C3%A1tis%20aproveite&sort_data[direction]=desc&sort_data[mode]=relevancy_monthly_grouped&search_type=keyword_unordered&media_type=all')
driver.maximize_window()
time.sleep(10)

# Webscraping with BeautifulSoup
soup = BeautifulSoup(driver.page_source, 'html.parser') 

ads_list = soup.select('div._99s5:has(:-soup-contains("ads use this creative and text"))')

Alternativ,不太高兴,但给你一个方向是 select <div> 有一个直接子 <span> 包含你的文本并向上移动结构.parent:

ads_list = []

for tag in soup.select('div > span:-soup-contains("ads use this creative and text")'):
    ads_list.append(tag.parent.parent.parent.parent.parent.parent)