我有一个看起来像这样的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
元素之后开始抓取?
答案 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>
>>>
那就是:
<a>
标记之前的所有<code>
标记。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>