您好我正在使用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标记之间标记。有美丽的汤和蟒蛇可以吗?谢谢!
答案 0 :(得分:2)
我稍微纠正了你的HTML。 (请注意,反斜杠应该是斜杠。)
要做到这一点,首先找到&#39; Hello&#39;字符串。在for循环中调用其中一个字符串s
。那么你想要的是s.findParent().findNextSibling()
。
我显示s
,s.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的外观。 有关上述代码的说明,请参阅第一个链接。