如何使用 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)
我正在尝试在 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)