如何从属性无差异的HTML元素中抓取原被告数据?
解决原被告数据爬取的区分问题
问题分析
你当前的代码中,find("td", class_ = "has-no-border")只会返回页面中第一个匹配该类名的元素,因此原被告都获取到了原告的数据。针对HTML结构中元素属性一致但文本标签明确的情况,完全可以通过文本内容或专属属性来区分定位。
解决方案
这里提供两种可靠的实现方式:
方式一:通过<th>的文本定位对应<td>
利用每个数据行中<th>的文本标签(如Plaintiff:/Defendant:),先定位到目标<th>,再获取其相邻的<td>元素:
from bs4 import BeautifulSoup import requests html_text = requests.get("https://dockets.justia.com/docket/puerto-rico/prdce/3:2023cv01127/175963").text soup = BeautifulSoup(html_text, "lxml") cases = soup.find_all("div", class_ = "wrapper jcard has-padding-30 blocks has-no-bottom-padding") for case in cases: case_title = case.find("div", class_ = "title-wrapper").text.strip() # 通过th文本定位原告对应的td case_plaintiff = case.find('th', string='Plaintiff:').find_next_sibling('td').text.strip() # 通过th文本定位被告对应的td case_defendant = case.find('th', string='Defendant:').find_next_sibling('td').text.strip() print(f"Case Title: {case_title}") print(f"Plaintiffs: {case_plaintiff}") print(f"Defendants: {case_defendant}")
方式二:利用data-th属性直接定位
观察HTML结构可知,<td>元素带有data-th属性,其值与对应<th>的文本一致(如Plaintiff/Defendant),可以直接通过该属性精准匹配:
from bs4 import BeautifulSoup import requests html_text = requests.get("https://dockets.justia.com/docket/puerto-rico/prdce/3:2023cv01127/175963").text soup = BeautifulSoup(html_text, "lxml") cases = soup.find_all("div", class_ = "wrapper jcard has-padding-30 blocks has-no-bottom-padding") for case in cases: case_title = case.find("div", class_ = "title-wrapper").text.strip() # 通过data-th属性定位原告 case_plaintiff = case.find('td', {'data-th': 'Plaintiff'}).text.strip() # 通过data-th属性定位被告 case_defendant = case.find('td', {'data-th': 'Defendant'}).text.strip() print(f"Case Title: {case_title}") print(f"Plaintiffs: {case_plaintiff}") print(f"Defendants: {case_defendant}")
说明
两种方式都能精准区分原被告对应的元素,其中方式二利用专属属性定位,稳定性更强(避免文本标签出现格式变化的影响)。
内容的提问来源于stack exchange,提问作者PressMeister
相关产品推荐
相关产品推荐

