抓取:如何使用 bS4 排除特定标签
Scraping : How to exclude specific tag with bS4
希望你一切都好你知道我如何在抓取中排除特定标签吗?
#Récupération des ingrédients
try:
ingredientsdiv = soup.find("div", class_="c-recipe-ingredients")
ingredientsbloc = ingredientsdiv.find("ul", class_="c-recipe-ingredients__list")
ingredients = [re.findall(r'^(?:(\d+)\s([^\W\d_]*))?(.*)', item.text.replace("\n", "").strip()) for item in ingredientsbloc.find_all("li", {"class": ""})]
except Exception as e:
ingredients = None
这是HTML代码
<div class="c-recipe-ingredients"><ul class="c-recipe-ingredients__list" data-id="258101"><li>10 cl de lait de coco</li><li>1 cuillère à café de poivre vert</li><li>Huile de pépin de raisin</li><li>Fleur de sel</li><li>4 brins de menthe</li><li>2 c&œligurs de laitue</li><li>4 citrons verts</li><li>12 tomates cerise</li><li>4 oignons nouveaux</li><li>600 g de filets de bar <span class="c-recipe-ingredients__item--sponso u-relative"><span><a target="_blank" href="https://www.pourdebon.com/bar-sauvage-d38?utm_source=750g&utm_medium=autopromo&utm_content=Top10_750g_Autopromo&utm_campaign=750g_autopromo_recette" class="u-some-link u-color-pourdebon xXx" onclick="ga('send', 'event', 'autopromo-pdb-ingredient', 'clic', '600\x20g\x20de\x20filets\x20de\x20bar')"> En direct des producteurs sur
<img src="/bundles/cuisinewebsite/img/partner/logo-pourdebon.png" alt="Logo Pourdebon" itemprop="logo"></a></span></span><script>
document.addEventListener('DOMContentLoaded', function() {
ga('send', 'event', 'autopromo-pdb-ingredient', 'view', '600\x20g\x20de\x20filets\x20de\x20bar', {
nonInteraction : true
});
});
</script></li></ul></div>
有赞助link,像这样:
<a target="_blank" href="" class="u-some-link u-color-pourdebon xXx" onclick="ga('send', 'event', 'autopromo-pdb-ingredient', 'clic', '600\x20g\x20de\x20filets\x20de\x20bar')"> Lorem ipsum
<img src="/bundles/cuisinewebsite/img/partner/logo-pourdebon.png" alt="Logo Pourdebon" itemprop="logo"></a>
我想在我的抓取(json 文件)中排除赞助 link 文本 :) 你有什么想法吗?
您想使用 li
标签准确提取什么?
如果要提取包含在 li
标签中的文本,只需添加 .text()
find_all("li", {"class": ""}).text
以上语句将删除锚标记内的 js & link 和 return 你的文本值。
出于所有意图和目的,如果您想从 li
之类的元素而不是嵌套的 a
和 script
元素中获取文本 - 您应该使用 NavigableString
所以,而不是 .text
- 你应该使用这个函数 -
import bs4
...
def get_only_text(elem):
for item in elem.children:
if isinstance(item, bs4.element.NavigableString):
yield item
然后在外面调用这个函数,join整个生成器得到最终的字符串-
ingredients = [re.findall(r'^(?:(\d+)\s([^\W\d_]*))?(.*)', ''.join(get_only_text(item)).strip()) for item in ingredientsbloc.find_all("li", {"class": ""})]
ingredients
-
的输出
[[('10', 'cl', ' de lait de coco')],
[('1', 'cuillère', ' à café de poivre vert')],
[('', '', 'Huile de pépin de raisin')],
[('', '', 'Fleur de sel')],
[('4', 'brins', ' de menthe')],
[('2', 'c', '&œligurs de laitue')],
[('4', 'citrons', ' verts')],
[('12', 'tomates', ' cerise')],
[('4', 'oignons', ' nouveaux')],
[('600', 'g', ' de filets de bar')]]
希望你一切都好你知道我如何在抓取中排除特定标签吗?
#Récupération des ingrédients
try:
ingredientsdiv = soup.find("div", class_="c-recipe-ingredients")
ingredientsbloc = ingredientsdiv.find("ul", class_="c-recipe-ingredients__list")
ingredients = [re.findall(r'^(?:(\d+)\s([^\W\d_]*))?(.*)', item.text.replace("\n", "").strip()) for item in ingredientsbloc.find_all("li", {"class": ""})]
except Exception as e:
ingredients = None
这是HTML代码
<div class="c-recipe-ingredients"><ul class="c-recipe-ingredients__list" data-id="258101"><li>10 cl de lait de coco</li><li>1 cuillère à café de poivre vert</li><li>Huile de pépin de raisin</li><li>Fleur de sel</li><li>4 brins de menthe</li><li>2 c&œligurs de laitue</li><li>4 citrons verts</li><li>12 tomates cerise</li><li>4 oignons nouveaux</li><li>600 g de filets de bar <span class="c-recipe-ingredients__item--sponso u-relative"><span><a target="_blank" href="https://www.pourdebon.com/bar-sauvage-d38?utm_source=750g&utm_medium=autopromo&utm_content=Top10_750g_Autopromo&utm_campaign=750g_autopromo_recette" class="u-some-link u-color-pourdebon xXx" onclick="ga('send', 'event', 'autopromo-pdb-ingredient', 'clic', '600\x20g\x20de\x20filets\x20de\x20bar')"> En direct des producteurs sur
<img src="/bundles/cuisinewebsite/img/partner/logo-pourdebon.png" alt="Logo Pourdebon" itemprop="logo"></a></span></span><script>
document.addEventListener('DOMContentLoaded', function() {
ga('send', 'event', 'autopromo-pdb-ingredient', 'view', '600\x20g\x20de\x20filets\x20de\x20bar', {
nonInteraction : true
});
});
</script></li></ul></div>
有赞助link,像这样:
<a target="_blank" href="" class="u-some-link u-color-pourdebon xXx" onclick="ga('send', 'event', 'autopromo-pdb-ingredient', 'clic', '600\x20g\x20de\x20filets\x20de\x20bar')"> Lorem ipsum
<img src="/bundles/cuisinewebsite/img/partner/logo-pourdebon.png" alt="Logo Pourdebon" itemprop="logo"></a>
我想在我的抓取(json 文件)中排除赞助 link 文本 :) 你有什么想法吗?
您想使用 li
标签准确提取什么?
如果要提取包含在 li
标签中的文本,只需添加 .text()
find_all("li", {"class": ""}).text
以上语句将删除锚标记内的 js & link 和 return 你的文本值。
出于所有意图和目的,如果您想从 li
之类的元素而不是嵌套的 a
和 script
元素中获取文本 - 您应该使用 NavigableString
所以,而不是 .text
- 你应该使用这个函数 -
import bs4
...
def get_only_text(elem):
for item in elem.children:
if isinstance(item, bs4.element.NavigableString):
yield item
然后在外面调用这个函数,join整个生成器得到最终的字符串-
ingredients = [re.findall(r'^(?:(\d+)\s([^\W\d_]*))?(.*)', ''.join(get_only_text(item)).strip()) for item in ingredientsbloc.find_all("li", {"class": ""})]
ingredients
-
[[('10', 'cl', ' de lait de coco')],
[('1', 'cuillère', ' à café de poivre vert')],
[('', '', 'Huile de pépin de raisin')],
[('', '', 'Fleur de sel')],
[('4', 'brins', ' de menthe')],
[('2', 'c', '&œligurs de laitue')],
[('4', 'citrons', ' verts')],
[('12', 'tomates', ' cerise')],
[('4', 'oignons', ' nouveaux')],
[('600', 'g', ' de filets de bar')]]