[英]Extract text blocks between tags separated by <br> without a tag title
我有一個 web 頁面,該頁面有一系列標簽,頁面中有特定的 class。 我感興趣的標簽如下所示:
<span class="my-span-class">
"Text of interest before break"
<br>
"Text of interest after break"
</span>
這些元素沒有標題,只是用文本填充的標簽,每個元素只被 1 分解
標簽。 我希望我的最終結果將“中斷前感興趣的文本”與“中斷后感興趣的文本”放在單獨的列表中,如下所示:
my_list_1 [Text of interest before break #1, Text of interest before break #2, Text of interest before break #3, etc...]
my_list _2 [Text of interest after break #1, Text of interest after break #2, Text of interest after break #3, etc....]
但是,我正在努力從下面的內容中獲得兩個單獨的列表。 這當前將兩個字符串一起輸出,如下所示:“中斷前感興趣的文本中斷后感興趣的文本”
from bs4 import BeautifulSoup
import urllib.request
f = urllib.request.urlopen("html.html")
soup = BeautifulSoup(f)
# get the tag type that looks like the element shown above
myText = soup.find_all("span", class_="my-span-clas")
results = []
for i in myText:
results.append(i.text.strip())
我想初始化一個單獨的列表(即 results_2 = []),並將“中斷后感興趣的文本”存儲在那里,並將第一個結果列表保留為“中斷前感興趣的文本”
您可以使用itertools.groupby
在<br>
之前和之后對節點進行分組。
通過在<br>
之前和之后處理非文本元素,我繼續前進並使其更加健壯。
from bs4 import BeautifulSoup, Tag
import itertools
soup = BeautifulSoup('''
<span class="my-span-class">
before break 1
<span>before break 1.1</span>
<br>
after break 1
</span>
<span class="my-span-class">
before break 2
<br>
after break 2
<span>after break 2.1</span>
</span>
''', 'html.parser')
befores, afters = [], []
for it in soup.select('.my-span-class'):
# this will give you three groups
groups = [list(g) for _, g in itertools.groupby(it.children, lambda c: c.name != 'br')]
# we just need items before br and after br
before, after = [g for g in groups if g[0].name != 'br']
befores.extend(before)
afters.extend(after)
print(befores)
print(afters)
打印:
['\n before break 1\n ', <span>before break 1.1</span>, '\n', '\n before break 2\n ']
['\n after break 1\n', '\n after break 2\n ', <span>after break 2.1</span>, '\n']
這應該足以演示如何在一個元素下划分子級。
剩下要做的就是循環afters
befores
清理每個項目。
根據您的 html,您可以使用contents
從標簽中獲取值。
contents[0]
將返回第一個字符串
contents[-1]
將返回最后一個字符串
from bs4 import BeautifulSoup
html='''<span class="my-span-class">
Text of interest before break
<br>
Text of interest after break
</span>
<span class="my-span-class">
Text of interest before break 1
<br>
Text of interest after break 1
</span>
<span class="my-span-class">
Text of interest before break 2
<br>
Text of interest after break 2
</span>
'''
soup = BeautifulSoup(html, 'html.parser')
Beforelist=[]
Afterlist=[]
for item in soup.find_all("span", class_="my-span-class"):
Beforelist.append(item.contents[0].strip())
Afterlist.append(item.contents[-1].strip())
print(Beforelist)
print(Afterlist)
Output :
['Text of interest before break', 'Text of interest before break 1', 'Text of interest before break 2']
['Text of interest after break', 'Text of interest after break 1', 'Text of interest after break 2']
您還可以將.stripped_strings
與zip(*iterable)
結合使用來單獨解壓縮它們。
myTexts = (tag.stripped_strings for tag in soup.find_all("span", class_="my-span-class"))
before, after = zip(*myTexts)
>>> before
('Text of interest before break', 'Text of interest before break 1', 'Text of interest before break 2')
>>> after
('Text of interest after break', 'Text of interest after break 1', 'Text of interest after break 2')
你可以試試html:
import htql
page="""
<span class="my-span-class">
Text of interest before break #1
<br>
Text of interest after break #1
</span>
<span class="my-span-class">
Text of interest before break #2
<br>
Text of interest after break #2
</span>
"""
results1 = htql.query(page, "<span (class='my-span-class')>.<br>1:px &trim ")
results2 = htql.query(page, "<span (class='my-span-class')>.<br>1:fx &trim ")
它產生:
>>> results1
[('Text of interest before break #1',), ('Text of interest before break #2',)]
>>> results2
[('Text of interest after break #1',), ('Text of interest after break #2',)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.