Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 9, 2020 20:33:21

The_Immortal
Зарегистрирован: 2020-09-08
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярка с тегом <nobp>

Пытаюсь выдрать текст, используя рег. выражение, под тегом

 <nobr>
, который находится внутри определенной таблицы:
 soup = BeautifulSoup(resArrow, 'lxml')
tbl = soup.find('tbl', id='maintbl')
for nobr in tbl.find_all('nobr', text=re.compile("MB")):
	# ничего не находится
Пример вывода содержимого одно из нужных тегов:
 <nobr>1895.35 MB<br/><a href="down.php?id=555"><b>2,55 tlm</b></a></nobr>

 print (nobr.getText())
выдает:
1895.35 MB2,55 tlm

В общем, ключевое "MB" есть, но почему-то в моей регулярке оно не подхватывается. Я уже пробовал и так:
 for nobr in tbl.find_all('nobr', text=re.compile(".*MB.*")):
и эдак:
 for nobr in tbl.find_all('nobr', text=re.compile("\d*.\d\d\s+MB")):
Да и просто указывал точную строку
 for nobr in tbl.find_all('nobr', text="1895.35 MB2,55 tlm"):
 for nobr in tbl.find_all('nobr', text="1895.35 MB"):
, но также ничего не находилось.

В чем может быть проблема?

Спасибо!

P.S. Понимаю, что вместо регулярки можно принимать все теги
 <nobr>
подряд и уже далее выполнять сравнение :
 for nobr in tbl.find_all('nobr'):
    if "MB" in nobr.getText(): # так работает
, однако очень хочется разобраться в чём может быть проблема.


Отредактировано The_Immortal (Сен. 9, 2020 20:40:33)

Офлайн

#2 Сен. 9, 2020 23:49:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9993
Репутация: +  857  -
Профиль   Отправить e-mail  

Регулярка с тегом <nobp>

https://beautiful-soup-4.readthedocs.io/en/latest/index.html?highlight=find_all#find-all

  
>>> import bs4
>>> 
>>> text = """
... <nobr><br/><a href="down.php?id=555"><b>2,55 tlm</b></a></nobr>
... <nobr>1895.35 MB<br/><a href="down.php?id=555"><b>2,55 tlm</b></a></nobr>
... <nobr><br/><a href="down.php?id=555"><b>2,56 tlm</b></a></nobr>
... <nobr><br/><a href="down.php?id=555"><b>2,57 tlm</b></a></nobr>
... <nobr>1896.36 MB<br/><a href="down.php?id=556"><b>2,58 tlm</b></a></nobr>
... """
>>> 
>>> soup = bs4.BeautifulSoup(text, 'html.parser')
>>> 
>>> soup(lambda tag: tag.name == 'nobr' and 'MB' in tag.getText())
[<nobr>1895.35 MB<br/><a href="down.php?id=555"><b>2,55 tlm</b></a></nobr>, <nobr>1896.36 MB<br/><a href="down.php?id=556"><b>2,58 tlm</b></a></nobr>]
>>> 
>>> [i.getText() for i in soup(lambda tag: tag.name == 'nobr' and 'MB' in tag.getText())]
['1895.35 MB2,55 tlm', '1896.36 MB2,58 tlm']
>>>

The_Immortal
однако очень хочется разобраться в чём может быть проблема
Может быть, ошибка в BeautifulSoup.

Тут показано, что строки нет у nobr
  
>>> import bs4
>>> 
>>> text = """
... <nobr><br/><a href="down.php?id=555"><b>2,55 tlm</b></a></nobr>
... <nobr>1895.35 MB<br/><a href="down.php?id=555"><b>2,55 tlm</b></a></nobr>
... <nobr><br/><a href="down.php?id=555"><b>2,56 tlm</b></a></nobr>
... <nobr><br/><a href="down.php?id=555"><b>2,57 tlm</b></a></nobr>
... <nobr>1896.36 MB<br/><a href="down.php?id=556"><b>2,58 tlm</b></a></nobr>
... """
>>> 
>>> soup = bs4.BeautifulSoup(text, 'html.parser')
>>> 
>>> soup('b', string=lambda i: '58' in i)
[<b>2,58 tlm</b>]
>>> 
>>> soup('nobr', string=lambda i: 'MB' in i)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/site-packages/bs4/element.py", line 1041, in __call__
    return self.find_all(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/bs4/element.py", line 1313, in find_all
    return self._find_all(name, attrs, text, limit, generator, **kwargs)
  File "/usr/lib/python3.6/site-packages/bs4/element.py", line 556, in _find_all
    found = strainer.search(i)
  File "/usr/lib/python3.6/site-packages/bs4/element.py", line 1704, in search
    found = self.search_tag(markup)
  File "/usr/lib/python3.6/site-packages/bs4/element.py", line 1684, in search_tag
    if found and self.text and not self._matches(found.string, self.text):
  File "/usr/lib/python3.6/site-packages/bs4/element.py", line 1736, in _matches
    return match_against(markup)
  File "<stdin>", line 1, in <lambda>
TypeError: argument of type 'NoneType' is not iterable
>>>



Отредактировано py.user.next (Сен. 9, 2020 23:58:39)

Офлайн

#3 Сен. 10, 2020 10:58:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Регулярка с тегом <nobp>

 import bs4
text = """
<nobr><br/><a href="down.php?id=555"><b>2,55 tlm</b></a></nobr>
<nobr>1895.35 MB<br/><a href="down.php?id=555"><b>2,55 tlm</b></a></nobr>
<nobr><br/><a href="down.php?id=555"><b>2,56 tlm</b></a></nobr>
<nobr><br/><a href="down.php?id=555"><b>2,57 tlm</b></a></nobr>
<nobr>1896.36 MB<br/><a href="down.php?id=556"><b>2,58 tlm</b></a></nobr>
"""
soup = bs4.BeautifulSoup(text, 'html.parser')
print soup.find_all(lambda tag: 'MB' in tag.text)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version