如何在带有beautifulsoup的网页中的某个文本之前获取所有<p>标签?

时间:2017-11-26 15:39:41

标签: python html parsing beautifulsoup web-crawler

我的网站有很多<p>个标签。我想要在网页中的某个唯一文本之前写入所有<p>标记。 我怎样才能做到这一点?

<p>p1</p>
<p>p2</p>
<p>p3</p>
<span class="zls" id=".B1.D9.87.D8.A7.DB.8C_.D9.88.D8.A"> certain unique text </span>
<p>p4</p>
<p>p5</p>

所以我想得到[p1,p2,p3]的列表,但我不想要p4和p5。

2 个答案:

答案 0 :(得分:2)

您可以使用find_all中的function来选择&#39; p&#39;标签只有当他们以前的所有兄弟姐妹都不包含某个文本时,例如:

html = '''
<p>p1</p>
<p>p2</p> 
<p>p3</p>
<span class="zls" id=".B1.D9.87.D8.A7.DB.8C_.D9.88.D8.A"> certain unique text </span>
<p>p4</p>
<p>p5</p>
'''
soup = BeautifulSoup(html, 'html.parser')

def select_tags(tag, text='certain unique text'):
    return tag.name=='p' and all(text not in t.text for t in tag.find_previous_siblings())

print(soup.find_all(select_tags))
  

[<p>p1</p>, <p>p2</p>, <p>p3</p>]

答案 1 :(得分:1)

除了先生t.m.adam已经展示的内容之外,你也可以这样做,以便在课程p之前出现那些zls标签中的文字:

from bs4 import BeautifulSoup

html_content = '''
<t>p0</t>
<y>p00</y> 
<p>p1</p>
<p>p2</p> 
<p>p3</p>
<span class="zls" id=".B1.D9.87.D8.A7.DB.8C_.D9.88.D8.A"> certain unique text </span>
<p>p4</p>
<p>p5</p>
'''
soup = BeautifulSoup(html_content, 'lxml')

for items in soup.select(".zls"):
    tag_items = [item.text for item in items.find_previous_siblings() if item.name=="p"]
    print(tag_items)

输出:

['p3', 'p2', 'p1']