【问题标题】:Find everything between two tags html in python在python中查找两个标签html之间的所有内容
【发布时间】:2020-02-05 04:56:22
【问题描述】:

我想要在<b> 中包含关键字的标题之后的第一个列表<ul> 中获取文本,如下所示:

<b> anything </b>
<p> KEYWORD </p> 
<b> anything </b>
<b> anything KEYWORD anything </b> #this is the title that I want
<some tag> anything <some tag>
<ul> 
# this is the TEXT what I want 
</ul>

我想要的是 RE 只考虑第三个 &lt;b&gt; 中的文本,但我写的 RE 得到第一个 &lt;b&gt;&lt;p&gt; 的关键字和第二个 &lt;/b&gt;

那是我的回复: re.search(r'&lt;b&gt;.*?(' + keyword + ').*?&lt;/b&gt;.*?&lt;ul&gt;(.*?)&lt;/ul&gt;')

谁能帮帮我?

【问题讨论】:

  • HTML 解析器不会更有效地解决这个问题吗?
  • @ObsidianAge 我也在使用 HTML 解析器,但在这部分我必须使用正则表达式。关于重复,这不完全是我的问题,在另一个解决方案中,他们没有考虑多个相等的标签,这正是我的问题。

标签: python regex


【解决方案1】:

如果这只是文字,请像这样关注内部&lt;b&gt;..&lt;/b&gt;

(?is)&lt;b&gt;(?:(?!&lt;/?b&gt;).)*?(keyword)(?:(?!&lt;/?b&gt;).)*?&lt;/b&gt;.*?&lt;ul&gt;\s*(.*?)\s*&lt;/ul&gt;

https://regex101.com/r/3WwDXM/1

展开

 (?is)

 <b>
 (?: (?! </?b> ) .)*?
 ( keyword )                   # (1)
 (?: (?! </?b> ) .)*?
 </b> 

 .*? 

 <ul> \s* 
 ( .*? )                       # (2)
 \s* </ul>

【讨论】:

  • 嗨,我尝试了你的解决方案,但它仍然得到错误的标签
  • 在我的例子中,关键字是一组OR,即:keyword = keyword1|keyword2|keyword3。你认为这可能是它出错的原因吗?
  • '(?is)&lt;b&gt;(?:(?!&lt;/?b&gt;).)*?(' + keywords+ ')(?:(?!&lt;/?b&gt;).)*?&lt;/b&gt;.*?&lt;ul&gt;\s*(.*?)\s*&lt;/ul&gt;'
【解决方案2】:

也许,这会做你想要提取的:

from bs4 import BeautifulSoup

html = '''
<b> anything </b>
<p> KEYWORD </p>
<b> anything </b>
<b> anything KEYWORD anything </b> #this is the title that I want
<some tag> anything <some tag>
<ul>
# this is the TEXT what I want
</ul>

<ul>
# this is not the TEXT what I want
</ul>

'''

soup = BeautifulSoup(html, 'html.parser')


b_tags = soup.findAll('b')
ul_tag = soup.find('ul')

desired_keyword = 'KEYWORD'

for b in b_tags:
    if desired_keyword in b.text:
        print(ul_tag.text.strip())

输出

# this is the TEXT what I want

【讨论】:

  • 嗨,艾玛!那不正是我需要的。我必须从这些列表中提取的一组文本不只有一个列表。这就是为什么我必须先找到标题,然后才能获得列表
  • 谢谢你,艾玛!这不完全是我的想法,但你的代码可以帮助我以不同的方式解决它
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多