Игнорировать ссылку в скобках при попытке извлечь другие ссылки - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь извлечь ссылки из блока 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 голосов
/ 29 декабря 2018

Вы можете проанализировать элементы в 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>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...