使用BeautifulSoup爬取房产网站缺失日期及无法抓取meta itemprop标签问题
问题解答
1. 日期字段缺失原因及解决
你现有代码分三次独立遍历所有房源外层容器,分别提取标题、描述、日期三类数据。其中提取日期的循环只有当容器内真的存在class="announcement-block__date"的标签时,才会往date列表追加内容,VIP/促销房源如果没有这个标签,对应循环逻辑会直接跳过,不会主动追加N/A,自然就会出现date列表长度比标题、描述短的情况。
正确逻辑应该是先遍历每一个房源外层容器,在单个容器内分别提取三个字段,找不到对应标签就直接填充N/A,保证三个列表的每一项都对应同一个房源,长度完全对齐。
2. meta itemprop标签提取失败原因及解决
meta标签是自闭合标签,本身没有内部文本,你用get_text()方法肯定拿不到值,它的内容全部存放在content属性里。另外你现有代码的遍历逻辑只查找了class="announcement-block__date"的div标签,根本没有定位到meta标签,所以返回空值。
提取示例:如果要拿itemprop为datePublished的发布日期,只需要在单个房源容器内执行tag.find('meta', attrs={'itemprop':'datePublished'}).get('content', 'N/A')即可,get方法自带缺省值,找不到对应标签会直接返回N/A。
修正后完整代码
from urllib.request import urlopen,Request from bs4 import BeautifulSoup as bsoup import ssl import pandas as pd def get_headers(): #Headers headers={'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-language':'en-US,en;q=0.9', 'cache-control':'max-age=0', 'upgrade-insecure-requests':'1', 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'} return headers ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE count = 1 # for pagination #Make list holder title = [] description = [] date = [] urls = ['https://www.unegui.mn/l-hdlh/l-hdlh-zarna/oron-suuts-zarna/5-r/'] for x in urls: count=1 y=x while(count < 2): # will get only 1st page print(x) req = Request(x, headers=get_headers()) #req all headers htmlfile = urlopen(req) htmltext = htmlfile.read() soup = bsoup(htmltext,'html.parser') # 改为单次遍历所有房源容器,每个容器内提取三个字段 for tag in soup.findAll('div',attrs={'class':'announcement-block-text-container announcement-block__text-container'}): # 提取标题 title_tag = tag.find('a', attrs={'class':'announcement-block__title'}) title_text = title_tag.get_text().strip() if title_tag else 'N/A' title.append(title_text if title_text else 'N/A') # 提取描述 desc_tag = tag.find('div', attrs={'class':'announcement-block__description'}) desc_text = desc_tag.get_text().strip() if desc_tag else 'N/A' description.append(desc_text if desc_text else 'N/A') # 提取日期,如果要拿meta标签的话替换下面这段即可 date_tag = tag.find('div', attrs={'class':'announcement-block__date'}) # 如果要提取meta itemprop的日期,把上两行换成↓ # date_tag = tag.find('meta', attrs={'itemprop':'datePublished'}) # date_text = date_tag.get('content', 'N/A').strip() if date_tag else 'N/A' date_text = date_tag.get_text().strip() if date_tag else 'N/A' date.append(date_text if date_text else 'N/A') # Go to next page count=count+1 page = '?page='+str(count) x=y+page data_frame = pd.DataFrame(list(zip(title,description,date)),columns=['Title', 'Description', 'Date'])
内容的提问来源于stack exchange,提问作者WX1505
相关产品推荐
相关产品推荐

