python - 如何从没有定义特征的表中提取值?
问题描述
我正在尝试从交叉引用网站中提取零件编号,但是当我检查元素时,表格周围使用的唯一标签是 tr、td、tbody 和 table,页面上的许多其他地方都使用了这些标签。目前我正在使用 Beautiful soup 和 selenium,并且我正在考虑使用 lxml.html 作为其 xpath 工具,但我似乎无法使用美丽的汤。
我试图从中提取值的网站是 https://jdparts.deere.com/servlet/com.deere.u90.jdparts.view.servlets.searchcontroller.PartialPartNumberSearchController?action=UNSIGNED_VIEW ,从技术上讲,我只想要零件号,制作,零件编号,零件类型和描述值,但我可以处理获取整个表格。
当我使用
html2 = browser.page_source
source = soup(html2, 'html.parser')
for article in source.find_all('td', valign='middle'):
PartNumber = article.text.strip()
number.append(PartNumber)
它在一行文本中为我提供了页面上的所有值和几个空白值,这与手动提取值一样需要筛选。
最终,我希望获得表格中的值并格式化为看起来像表格,我可以删除我不需要的列。收集表中信息的最佳方法是什么?
解决方案
一种方法Qty.
是在您想要的表格的开头找到哪个元素,然后查找上一个表格。然后,您可以遍历tr
元素并从每行中的所有元素生成一行值td
。
Pythonitemgetter()
函数在这里可能很有用,因为它可以让您从更大的列表中提取所需的元素(以任何顺序)。在这个例子中,我选择了 items ,但如果不需要1,2,3,4,5
say ,你可以提供。Make
1,3,4,5
搜索结果可能有多页结果,如果是这种情况,它会检查Next Page
按钮,如果存在则调整params
以获取下一页结果。这一直持续到找不到下一页:
from operator import itemgetter
import requests
from bs4 import BeautifulSoup
import csv
search_term = "AT2*"
params = {
"userAction" : "search",
"browse" : "",
"screenName" : "partSearch",
"priceIdx" : 1,
"searchAppType" : "",
"searchType" : "search",
"partSearchNumber" : search_term,
"pageIndex" : 1,
"endPageIndex" : 100,
}
url = 'https://jdparts.deere.com/servlet/com.deere.u90.jdparts.view.servlets.searchcontroller.PartNumberSearch'
req_fields = itemgetter(1, 2, 3, 4, 5)
page_index = 1
session = requests.Session()
start_row = 0
with open('output.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
while True:
print(f'Page {page_index}')
req = session.post(url, params=params)
soup = BeautifulSoup(req.content, 'html.parser')
table = soup.find(text='Qty.').find_previous('table')
for tr in table.find_all('tr')[start_row:]:
row = req_fields([value.get_text(strip=True) for value in tr.find_all('td')])
if row[0]:
csv_output.writerow(row)
if soup.find(text='Next Page'):
start_row = 2
params = {
"userAction" : "NextPage",
"browse" : "NextPage",
"pageIndex" : page_index,
"endPageIndex" : 15,
}
page_index += 1
else:
break
这会给你一个output.csv
文件开始:
Part Number,Make,Part No.,Part Type,Description
AT2,Kralinator,PMTF15013,Filters,Filter
AT2,Kralinator,PMTF15013J,Filters,Filter
AT20,Berco,T139464,Undercarriage All Makes,Spring Pin
AT20061,A&I Products,A-RE29882,Clutch,Clutch Disk
注意:这使用了requests
而不是使用selenium
,因为它会更快。
推荐阅读
- c# - 在 autofac 中可视化依赖树深度
- c# - c# 中 new() 对泛型方法的实际作用
- python - 在执行 numpy 操作时,是否有一种快速方法可以忽略数组的某些值?
- html - 父 div(flex) 中的 2 个 div,第一个 div 是固定宽度 - 将第二个宽度扩展到其余部分
- c - 二进制搜索不返回位置
- ruby-on-rails - Ruby on Rails 应用程序和咨询锁中的 PgBouncer
- javascript - Materialize M 未定义
- ruby-on-rails - 设计销毁用户在索引页面中创建错误
- c# - 使用 Azure Active Directory 对 .NET Core 2.2 API 进行身份验证时出现 CORS 错误
- .net-core - 将 Visual Studio 2019 更新到 16.4.0 后,我无法使用目标框架 2.2 运行测试