如何用BeautifulSoup提取网页<li>标签中的更多参展商数据?
问题:如何提取参展商列表中更多标签内的数据?
我已经用BeautifulSoup获取到参展商的公司名称和国家信息,代码如下:
from bs4 import BeautifulSoup import requests url ="https://www.cosmoprof.com/en/visit/exhibitors-directory/exhibitors-list/?y=0&page=1" page = requests.get(url) soup = BeautifulSoup(page.content, 'html.parser') results = soup.find_all("div", class_="col-md-3 result-item mb-40") for result in results: company = result.find("h3") country = result.find("li") print(f"company:{company.get_text()}") print(f"country:{country.get_text()}")
输出结果:
company:LABORATOIRE REVITACARE country: COUNTRY/REGION: France company:LONDONTOWN INC. country: COUNTRY/REGION: USA
但尝试提取Sector、Hall等更多
<div class="col-md-3 result-item mb-40"> <span class="tag-new">new 2023</span> <h3>LABORATOIRE REVITACARE</h3> <ul class="lista-dati-espositore" style="min-height:110px;"> <li><span> COUNTRY/REGION:</span> France</li> <li style="min-height:50px;"><span> Sector:</span> Beauty & Spa</li> <li><span> Hall:</span> 29</li> <li> <span> Stand No.:</span> E/12 </li> <li><span> Opening dates:</span> From 17 to 20 March 2023</li> </ul> <a href="/en/visit/exhibitors-directory/exhibitors-list/exhibitor-details/?id=22838&s=laboratoire-revitacare" title="LABORATOIRE REVITACARE"> Find out more</a>
解决方案
可以通过两种方式提取所有
方法一:遍历所有字段
先定位到每个参展商的<ul>标签(class为lista-dati-espositore),再遍历其中的所有<li>,自动提取标签和对应内容:
from bs4 import BeautifulSoup import requests url = "https://www.cosmoprof.com/en/visit/exhibitors-directory/exhibitors-list/?y=0&page=1" page = requests.get(url) soup = BeautifulSoup(page.content, 'html.parser') results = soup.find_all("div", class_="col-md-3 result-item mb-40") for result in results: # 获取公司名称,去除首尾空格 company_name = result.find("h3").get_text(strip=True) print(f"公司名称: {company_name}") # 定位到参展信息的列表容器 info_container = result.find("ul", class_="lista-dati-espositore") if info_container: # 遍历每个列表项 for li in info_container.find_all("li"): # 提取标签文本(如COUNTRY/REGION:) label = li.find("span").get_text(strip=True) # 提取对应值,去除标签和多余空格 value = li.get_text(strip=True).replace(label, "").strip() print(f"{label} {value}") print("---")
方法二:精准提取指定字段
如果只需要特定字段(比如Sector、Hall、展位号),可以通过匹配<span>内的文本定位对应的<li>:
from bs4 import BeautifulSoup import requests url = "https://www.cosmoprof.com/en/visit/exhibitors-directory/exhibitors-list/?y=0&page=1" page = requests.get(url) soup = BeautifulSoup(page.content, 'html.parser') results = soup.find_all("div", class_="col-md-3 result-item mb-40") for result in results: company_name = result.find("h3").get_text(strip=True) print(f"公司名称: {company_name}") # 提取国家/地区 country_item = result.find("li", string=lambda text: "COUNTRY/REGION:" in text) if country_item: country = country_item.get_text(strip=True).split(":")[-1].strip() print(f"国家/地区: {country}") # 提取行业领域 sector_item = result.find("li", string=lambda text: "Sector:" in text) if sector_item: sector = sector_item.get_text(strip=True).split(":")[-1].strip() print(f"行业领域: {sector}") # 提取展馆号 hall_item = result.find("li", string=lambda text: "Hall:" in text) if hall_item: hall = hall_item.get_text(strip=True).split(":")[-1].strip() print(f"展馆号: {hall}") # 提取展位号 stand_item = result.find("li", string=lambda text: "Stand No.:" in text) if stand_item: stand_no = stand_item.get_text(strip=True).split(":")[-1].strip() print(f"展位号: {stand_no}") # 提取开放日期 dates_item = result.find("li", string=lambda text: "Opening dates:" in text) if dates_item: dates = dates_item.get_text(strip=True).split(":")[-1].strip() print(f"开放日期: {dates}") print("---")
说明
- 使用
get_text(strip=True)可以自动去除文本前后的空格、换行符,避免输出杂乱内容。 - 方法一适合批量提取所有字段,方法二更适合按需获取特定信息,可根据需求选择。
内容的提问来源于stack exchange,提问作者Eskild Næss
相关产品推荐
相关产品推荐

