如何通过 class python 中的特定子字符串查找 class 字符串的跨度
How to find span with class string by specific substring in the class python
我正在使用 Beautifulsoup 下载一些数据。我提取代码,它看起来像这样。
<td><span class="calendar-date-2">11:50 PM </span></td>,
<tr><td>
<div title="ABC"></div>
</td></tr>
<span>SEP</span>
<td><span class="calendar-date-1">12:00 PM </span></td>,
<tr><td>
<div title="CDE"></div>
</td></tr>
<span>OCT</span>
<td><span class="calendar-date-3">12:10 PM </span></td>,
<tr><td>
<div title="FGH"></div>
</td></tr>
<span>NOV</span>
我需要将{time, title, month} 放入一个 df 中。这需要通过 class 属性中的子字符串 "calendar-date" select
我想用
bs4.find_all('span',{class: XXX})
但这需要 class 具有准确的属性。
我不知道怎么写代码。
您可以获取所有 span
个标签,然后将它们过滤掉:
spans = [s for s in bs4.find_all('span') if s.get('class', [''])[0].startswith('calendar-date')]
您可以使用正则表达式。
例如:
import re
from bs4 import BeautifulSoup
html = """<td><span class="calendar-date-2">11:50 PM </span></td>,
<tr><td>
<div title="ABC"></div>
</td></tr>
<span>SEP</span>
<td><span class="calendar-date-1">12:00 PM </span></td>,
<tr><td>
<div title="CDE"></div>
</td></tr>
<span>OCT</span>
<td><span class="calendar-date-3">12:10 PM </span></td>,
<tr><td>
<div title="FGH"></div>
</td></tr>
<span>NOV</span>"""
soup = BeautifulSoup(html, "html.parser")
for span in soup.find_all("span", class_=re.compile(r"^calendar\-date\-\d+")):
print(span.text)
print(span.find_previous('td').find_next('div')['title'])
print(span.find_next('span').text)
输出:
11:50 PM
ABC
SEP
12:00 PM
CDE
OCT
12:10 PM
FGH
NOV
尝试 css 选择器而不使用正则表达式。
from bs4 import BeautifulSoup
datahtml = """<td><span class="calendar-date-2">11:50 PM </span></td>,
<tr><td>
<div title="ABC"></div>
</td></tr>
<span>SEP</span>
<td><span class="calendar-date-1">12:00 PM </span></td>,
<tr><td>
<div title="CDE"></div>
</td></tr>
<span>OCT</span>
<td><span class="calendar-date-3">12:10 PM </span></td>,
<tr><td>
<div title="FGH"></div>
</td></tr>
<span>NOV</span>"""
soup = BeautifulSoup(datahtml, "html.parser")
for span in soup.select("[class^='calendar-date-']"):
print(span.text)
print(span.find_previous('td').find_next('div')['title'])
print(span.find_next('span').text)
我正在使用 Beautifulsoup 下载一些数据。我提取代码,它看起来像这样。
<td><span class="calendar-date-2">11:50 PM </span></td>,
<tr><td>
<div title="ABC"></div>
</td></tr>
<span>SEP</span>
<td><span class="calendar-date-1">12:00 PM </span></td>,
<tr><td>
<div title="CDE"></div>
</td></tr>
<span>OCT</span>
<td><span class="calendar-date-3">12:10 PM </span></td>,
<tr><td>
<div title="FGH"></div>
</td></tr>
<span>NOV</span>
我需要将{time, title, month} 放入一个 df 中。这需要通过 class 属性中的子字符串 "calendar-date" select
我想用
bs4.find_all('span',{class: XXX})
但这需要 class 具有准确的属性。
我不知道怎么写代码。
您可以获取所有 span
个标签,然后将它们过滤掉:
spans = [s for s in bs4.find_all('span') if s.get('class', [''])[0].startswith('calendar-date')]
您可以使用正则表达式。
例如:
import re
from bs4 import BeautifulSoup
html = """<td><span class="calendar-date-2">11:50 PM </span></td>,
<tr><td>
<div title="ABC"></div>
</td></tr>
<span>SEP</span>
<td><span class="calendar-date-1">12:00 PM </span></td>,
<tr><td>
<div title="CDE"></div>
</td></tr>
<span>OCT</span>
<td><span class="calendar-date-3">12:10 PM </span></td>,
<tr><td>
<div title="FGH"></div>
</td></tr>
<span>NOV</span>"""
soup = BeautifulSoup(html, "html.parser")
for span in soup.find_all("span", class_=re.compile(r"^calendar\-date\-\d+")):
print(span.text)
print(span.find_previous('td').find_next('div')['title'])
print(span.find_next('span').text)
输出:
11:50 PM
ABC
SEP
12:00 PM
CDE
OCT
12:10 PM
FGH
NOV
尝试 css 选择器而不使用正则表达式。
from bs4 import BeautifulSoup
datahtml = """<td><span class="calendar-date-2">11:50 PM </span></td>,
<tr><td>
<div title="ABC"></div>
</td></tr>
<span>SEP</span>
<td><span class="calendar-date-1">12:00 PM </span></td>,
<tr><td>
<div title="CDE"></div>
</td></tr>
<span>OCT</span>
<td><span class="calendar-date-3">12:10 PM </span></td>,
<tr><td>
<div title="FGH"></div>
</td></tr>
<span>NOV</span>"""
soup = BeautifulSoup(datahtml, "html.parser")
for span in soup.select("[class^='calendar-date-']"):
print(span.text)
print(span.find_previous('td').find_next('div')['title'])
print(span.find_next('span').text)