尝试提取其他链接时,请忽略括号中的链接

时间:2018-12-28 23:50:00

标签: python beautifulsoup

我正在尝试从p块中提取链接,但是我想忽略括号内的任何内容。例如,

<p> 
  Some text (even more text <a href='link_text'>link_text</a>) another link <a href='link_text2'>link_text2</a>
</p>

我只想选择括号内的任何链接,因此在上述情况下,仅选择link_text2链接。我目前正在使用此链接...

 ps = content.find_all('p', recursive=False)
 for p in ps:
    as = p.find_all('a', recursive=False)

我认为我必须使用一个正则表达式,但是不确定如何合并它,以便忽略括号中的任何链接。此正则表达式用于隔离括号中的任何内容-\(.*?\)

有人可以帮助吗?

1 个答案:

答案 0 :(得分:1)

您可以分析BeautifulSoup.contents中的元素以查找所有a对象。然后可以对后者进行过滤,以确保周围的内容不会创建()对:

from bs4 import BeautifulSoup as soup
def is_valid(ind:int, content:list, flag=False) -> bool:
   return not isinstance(content[ind], str) or (['(', ')'][flag] not in content[ind])

s = """
 <p> 
   Some text (even more text <a href='link_text'>link_text</a>) another link <a href='link_text2'>link_text2</a>
 </p>
"""
d = soup(s, 'html.parser').p.contents
l = [[i, a] for i, a in enumerate(d) if getattr(a, 'name', None) == 'a']
new_l = [a for i, a in l if (not i or i == len(d)-1) or (is_valid(i-1, d) and is_valid(i+1, d, True))]

输出:

[<a href="link_text2">link_text2</a>]