我尝试仅从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获取所选元素?任何帮助将不胜感激。
答案 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