使用beautifulsoup在两个i标签之间找到标签

时间:2017-08-16 02:00:54

标签: python html

您好我正在使用python和beautifulsoup。我有一个html页面,如下所示:

<i>Hello<\i>
<a href="www.google.com"> Google <\a>
<i>Bye<\i>
<a href="www.google.com"> Google2 <\a>
<i>Hello<\i>
<a href="www.google.com"> Google3 <\a>
<i>Bye<\i>

我想得到所有的&#34; a&#34;在Hello和Bye标记之间标记文本(我知道该怎么做,我只是不知道如何找到它们)但不在Bye和Hello标记之间标记。有美丽的汤和蟒蛇可以吗?谢谢!

3 个答案:

答案 0 :(得分:2)

我稍微纠正了你的HTML。 (请注意,反斜杠应该是斜杠。)

要做到这一点,首先找到&#39; Hello&#39;字符串。在for循环中调用其中一个字符串s。那么你想要的是s.findParent().findNextSibling()

我显示ss.findParent()s.findParent().findNextSibling(),向您展示我是如何根据这些字符串构建您需要的内容。

>>> import bs4
>>> HTML = '''\
... <i>Hello</i>
... <a href="www.google.com"> Google </a>
... <i>Bye</i>
... <a href="www.google.com"> Google2 </a>
... <i>Hello</i>
... <a href="www.google.com"> Google3 </a>
... <i>Bye</i>
... '''
>>> soup = bs4.BeautifulSoup(HTML, 'lxml')
>>> for s in soup.find_all(string='Hello'):
...     s, s.findParent(), s.findParent().findNextSibling()
...     
('Hello', <i>Hello</i>, <a href="www.google.com"> Google </a>)
('Hello', <i>Hello</i>, <a href="www.google.com"> Google3 </a>)

答案 1 :(得分:1)

你可以混合使用BeautifulSoup和regex。这里使用regex来获取限制标记之间的所有内容,然后使用BeautifulSoup来提取锚标记。

from bs4 import BeautifulSoup
import re

excerpts = re.findall(r'<i>Hello<\\i>(.*?)<i>Bye<\\i>', html, re.DOTALL)

for e in excerpts:
    soup = BeautifulSoup(e)
    for link in soup.findAll('a'):
        print(link)

输出:

<a href="www.google.com"> Google </a>
<a href="www.google.com"> Google3 </a>

答案 2 :(得分:0)

也许您可以使用re模块。参考见Regular Expression Howto for py2

str_tags = """
<i>Hello<\i>
<a href="www.google.com"> Google <\a>
<i>Bye<\i>
<a href="www.google.com"> Google2 <\a>
<i>Hello<\i>
<a href="www.google.com"> Google3 <\a>
<i>Bye<\i>
"""

import re
str_re = re.compile(r".*Hello.*\s<a[^>]*>([\w\s]+)<\a>\s<i>Bye")
content_lst = str_re.findall(str_tags)
if content_lst:
    print(content_lst)
else:
    print("Not found")

输出

  

['Google','Google3']

请注意,此方法在很大程度上取决于您的html的外观。 有关上述代码的说明,请参阅第一个链接。