从网站使用BeautifulSoup仅获取一些标签<p>

时间:2019-06-14 08:48:48

标签: python beautifulsoup

我尝试仅从selectet标签获取文本,例如:

<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>

我尝试获取“ tekst 1 tekst 2 tekst 3 tekst 4”(但标记中的文本完全不同,例如“ tekst 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 个答案:

答案 0 :(得分:1)

使用正则表达式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

答案 1 :(得分:1)

因此,只需要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

答案 2 :(得分:0)

find_all()函数始终返回列表。

注意:text参数是一个旧名称,因为BeautifulSoup 4.4.0被称为string

  

尽管字符串用于查找字符串,但您可以将其与   查找标签的参数:Beautiful Soup将查找其标签的所有标签   .string与您的string值匹配。此代码查找其   .string是“ tekst”:

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']

答案 3 :(得分:0)

一些不同的选项,取决于您实际想要进行的操作。使用bs4 4.7.1。

Stock