如何刮掉紧跟某个元素的元素?

时间:2015-12-27 08:17:08

标签: python beautifulsoup

我有一个看起来像这样的Html文档:

<div id="whatever">
  <a href="unwanted link"></a>
  <a href="unwanted link"></a>
  ...
  <code>blah blah</code>
  ...
  <a href="interesting link"></a>
  <a href="interesting link"></a>
  ...
</div>

我想只抓取紧跟在code标记之后的链接。如果我soup.findAll('a'),它将返回所有超链接。

如何让BS4在特定code元素之后开始抓取?

2 个答案:

答案 0 :(得分:4)

尝试soup.find_all_next()

>>> tag = soup.find('div', {'id': "whatever"})
>>> tag.find('code').find_all_next('a')
[<a href="interesting link"></a>, <a href="interesting link"></a>]
>>> 

soup.find_all()类似,但它会在标记后找到所有标记

如果您想在<a>之前移除<code>代码,我们会有一个名为soup.find_all_previous()的函数:

>>> tag.find('code').find_all_previous('a')
[<a href="unwanted link"></a>, <a href="unwanted link"></a>]

>>> for i in tag.find('code').find_all_previous('a'):
...     i.extract()
...     
... 
<a href="unwanted link"></a>
<a href="unwanted link"></a>

>>> tag
<div id="whatever">


  ...
  <code>blah blah</code>
  ...
  <a href="interesting link"></a>
<a href="interesting link"></a>
  ...
</div>
>>> 

那就是:

  1. 查找<a>标记之前的所有<code>标记。
  2. 使用soup.extract()for循环删除它们。

答案 1 :(得分:2)

更简单,更简单的方法是将一串css选择器传递到.select()方法,然后使用decompose删除链接。在这里,您需要使用所谓的 General Sibling Selector ~来选择所有锚点,它们是code的兄弟:code ~ a < / p>

soup = BeautifulSoup('''<div id="whatever">
      <a href="unwanted link"></a>
      <a href="unwanted link"></a>
      ...
      <code>blah blah</code>
      ...
      <a href="interesting link"></a>
      <a href="interesting link"></a>
      ...
      </div>''', 
     'lxml'
)

for link in soup.select('code ~ a'):
    link.decompose()     

print(soup)

产生:

<html><body><div id="whatever">
<a href="unwanted link"></a>
<a href="unwanted link"></a>
  ...
  <code>blah blah</code>
  ...


  ...
</div></body></html>

code标记之后删除所有链接的另一种方法是迭代列表,通过find_all方法返回以查找所有&#34;代码&#34;文档中的标记和每个标记都使用find_all_next,它会为您提供下一个a标记的列表。然后,您迭代列表并使用decompose从树中删除标记,然后完全销毁它及其内容。

演示

In [85]: from bs4 import BeautifulSoup

In [86]: soup = BeautifulSoup('''<div id="whatever">
   ....:   <a href="unwanted link"></a>
   ....:   <a href="unwanted link"></a>
   ....:   ...
   ....:   <code>blah blah</code>
   ....:   ...
   ....:   <a href="interesting link"></a>
   ....:   <a href="interesting link"></a>
   ....:   ...
   ....: </div>''', 'lxml')

In [87]: for code in soup.find_all('code'):
   ....:     for link in code.find_all_next('a'):
   ....:         link.decompose()
   ....:         

In [88]: soup
Out[88]: 
<html><body><div id="whatever">
<a href="unwanted link"></a>
<a href="unwanted link"></a>
  ...
  <code>blah blah</code>
  ...


  ...
</div></body></html>