如何从没有定义特征的表中提取值?

2024-05-18 23:28:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个交叉引用网站中提取零件号,但当我检查元素时,表周围使用的标签只有tr、td、tbody和table,它们在页面的许多其他位置都有使用。目前我正在使用美丽的汤和硒,我正在考虑使用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)

它给出了页面上的所有值和一行文本中的几个空白值,这和手动提取值一样需要做大量的筛选工作。你知道吗

最终,我希望得到表中的值,并将其格式化为类似于表的格式,并且我可以删除不需要的列。收集表格中的信息最好的方法是什么?你知道吗


Tags: com元素source网站htmlarticle页面标签
1条回答
网友
1楼 · 发布于 2024-05-18 23:28:31

一种方法是找到Qty.,它是您想要的表开头的元素,然后查找上一个表。然后可以遍历tr元素,并从每行的所有td元素中生成一行值。你知道吗

Python^{}函数在这里可能很有用,因为它允许您从更大的列表中提取所需的元素(以任何顺序)。在本例中,我选择了项1,2,3,4,5,但是如果不需要说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,因为这样会更快。你知道吗

相关问题 更多 >

    热门问题