Получение только некоторых тегов <p>с помощью BeautifulSoup с веб-сайта - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь получить текст только из выбранных тегов, например:

<div class="article-container">
  <p>tekst 1</p> <!-- this tag -->
  <p>none</p>
  <p>tekst 2</p> <!-- this tag -->
  <p>none</p>
  <p>tekst 3</p> <!-- this tag -->
  <p>none</p>
  <p>tekst 4</p> <!-- this tag -->
</div>

Я пытаюсь получить 'текст 1 текст 2 текст 3 текст 4' (но текст в тегах совершенно другой 'текст1 'и т. Д. Являются лишь примерами),

Моя простая функция python выглядит следующим образом:

def get_article(url):
    page = requests.get(str(url))
    soup = BeautifulSoup(page.text, 'html.parser')

    article = soup.find(class_='article-container')

    article_only = article.text

    return(article_only)

Но он возвращает весь текст.Есть ли способ получить выбранные элементы, как в примере выше, используя BS?Любая помощь будет оценена.

Ответы [ 4 ]

1 голос
/ 14 июня 2019

Так как вам нужен только элемент 1,3,5,7, вы можете сделать это:

КОД:

from bs4 import BeautifulSoup as soup

html = """<div class="article-intro">
<p>tekst 1</p>
<p>none</p>
<p>tekst 2</p>
<p>none</p>
<p>tekst 3</p>
<p>none</p>
<p>tekst 4</p>
</div>"""

page = soup(html, 'html.parser')
div = page.find('div',{'class':'article-intro'})
ps = div.find_all('p')
for i in range(len(ps)):
    if i % 2 == 0:
        print(ps[i].text)

выход:

tekst 1
tekst 2
tekst 3
tekst 4
1 голос
/ 14 июня 2019

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

from bs4 import BeautifulSoup
import re

html='''<div class="article-intro">
<p>tekst 1</p>
<p>none</p>
<p>tekst 2</p>
<p>none</p>
<p>tekst 3</p>
<p>none</p>
<p>tekst 4</p>
</div>'''

soup=BeautifulSoup(html,'html.parser')
for item in soup.find('div', class_='article-intro').find_all('p', text=re.compile('tekst')):
    print(item.text)

Вывод:

tekst 1
tekst 2
tekst 3
tekst 4

Или вы можете использовать функцию python lambda.

from bs4 import BeautifulSoup

html='''<div class="article-intro">
<p>tekst 1</p>
<p>none</p>
<p>tekst 2</p>
<p>none</p>
<p>tekst 3</p>
<p>none</p>
<p>tekst 4</p>
</div>'''

soup=BeautifulSoup(html,'html.parser')
for item in soup.find('div', class_='article-intro').find_all(lambda tag:tag.name=='p' and 'tekst' in tag.text):
    print(item.text)

Вывод:

tekst 1
tekst 2
tekst 3
tekst 4
0 голосов
/ 14 июня 2019

Несколько разных вариантов в зависимости от того, что вы на самом деле хотите сделать, двигаясь вперед.Использование bs4 4.7.1.

from bs4 import BeautifulSoup as bs

html = '''
<div class="article-container">
  <p>tekst 1</p> <!-- this tag -->
  <p>none</p>
  <p>tekst 2</p> <!-- this tag -->
  <p>none</p>
  <p>tekst 3</p> <!-- this tag -->
  <p>none</p>
  <p>tekst 4</p> <!-- this tag -->
</div>
'''

soup = bs(html, 'lxml')
#odd indices
items = [item.text for item in soup.select('.article-container p:nth-child(odd)')]
print(items)

#excluding None
items = [item.text for item in soup.select('.article-container p:not(:contains("none"))')]
print(items)

#including tekst
items = [item.text for item in soup.select('.article-container p:contains("tekst")')]
print(items)

#providing nth list
items = [item.text for item in soup.select('.article-container p:nth-of-type(1), .article-container p:nth-of-type(3), .article-container p:nth-of-type(5), .article-container p:nth-of-type(7)')]
print(items)
0 голосов
/ 14 июня 2019

find_all () функция всегда возвращает список.

ПРИМЕЧАНИЕ. Аргумент text - это старое имя, поскольку BeautifulSoup 4.4.0 называется string.

Хотя строка предназначена для поиска строк, вы можете комбинировать ее с аргументами, которые находят теги: Beautiful Soup найдет все теги, чья строка .string соответствует вашему значению для строки.Этот код находит теги, у которых .string - «текст»:

from bs4 import BeautifulSoup 
import re  

html = '''<div class="article-container">
<p>tekst 1</p>
<p>none</p>
<p>tekst 2</p>
<p>none</p>
<p>tekst 3</p>
<p>te</p>
<p>tekst 4</p>
</div>'''

soup = BeautifulSoup(html, 'lxml')
article = soup.select("div[class='article-container']")[0]
article_only = article.find_all(string=re.compile("tekst"))
print(article_only)

O / P:

['tekst 1', 'tekst 2', 'tekst 3', 'tekst 4']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...