Исключить данные из тега - PullRequest
3 голосов
/ 04 апреля 2019

Я хочу исключить определенный текст внутри тега html span.В приведенном ниже примере я просто хотел получить весь test2 текст из span с class в a-list-item.

мой код:

<span class="a-list-item">test1</span>
<span class="a-list-item">test2</span>
<span class="a-list-item">test2</span>

мой код: tag = tag.find_all("span", {"class" : "a-list-item"})

Как получить все test2 только.Спасибо за ваш ответ

Ответы [ 3 ]

2 голосов
/ 04 апреля 2019

Похоже, вы используете Beautiful Soup. В Beautiful Soup 4.7+ это легко сделать, просто используя select вместо find_all. Вы можете использовать :contains(), заключенный в :not(), чтобы исключить пролеты, содержащие определенный текст.

from bs4 import BeautifulSoup
markup = '''
<span class="a-list-item">test1</span> 
<span class="a-list-item">test2</span> 
<span class="a-list-item">test2</span>
'''
soup = BeautifulSoup(markup)
print(soup.select("span.a-list-item:not(:contains(test1))"))

выход

[<span class="a-list-item">test2</span>, <span class="a-list-item">test2</span>]
0 голосов
/ 04 апреля 2019

Используйте регулярное выражение re для поиска конкретного текста.

from bs4 import BeautifulSoup
import re
html = '''
<span class="a-list-item">test1</span> 
<span class="a-list-item">test2</span> 
<span class="a-list-item">test2</span>
'''
soup = BeautifulSoup(html,'html.parser')
items=soup.find_all('span',text=re.compile("test2"))
for item in items:
    print(item.text)

Вывод:

test2
test2
0 голосов
/ 04 апреля 2019

Вы можете пойти с применением xpath для исключения, содержащего test1

//span[@class='a-list-item' and not(contains(text(), 'test1'))]

Например

from lxml.html import fromstring
# url = ''
# tree = html.fromstring( requests.get(url).content)
h = '''
<html>
 <head></head>
 <body>
  <span class="a-list-item">test1</span> 
  <span class="a-list-item">test2</span> 
  <span class="a-list-item">test2</span>
 </body>
</html>
'''
tree = fromstring(h)
items = [item.text for item in tree.xpath("//span[@class='a-list-item' and not(contains(text(), 'test1'))]")]
print(items)

Или протестировать каждый квалифицирующий узел CSS (на основе тега и класса) текстовое значение

from bs4 import BeautifulSoup as bs

h = '''
<html>
 <head></head>
 <body>
  <span class="a-list-item">test1</span> 
  <span class="a-list-item">test2</span> 
  <span class="a-list-item">test2</span>
 </body>
</html>
'''
soup = bs(h, 'lxml')
items = [item.text for item in soup.select('span.a-list-item') if  'test1' not in item.text]
print(items)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...