python 为什么在按字符串选择时列表索引超出范围?

blmhpbnm  于 2023-01-24  发布在  Python
关注(0)|答案(1)|浏览(147)

我已经得到了这个代码到目前为止刮OEM,OEM编号,描述,从这个网站和它给我一个列表索引超出范围

pip install beautifulsoup4

from bs4 import BeautifulSoup

import requests

url = "https://www.advantagenationalsupply.com/oem-catalog/"

result = requests.get(url)

doc = BeautifulSoup(result.text, "html.parser")

print(doc.prettify())

ANS = doc.find_all(text="ANS-")

print(ANS)

parent = ANS[0].parent

我试着运行这个,并期望得到一个list的项目有关的ANS在网站上。但相反,我得到了“列表索引超出范围”

wljmcqd8

wljmcqd81#

这里的主要问题是string argument的值必须完全匹配,否则在使用find_all()时必须使用regex

doc.find_all(string=re.compile("ANS-"))

让它变得更简单,使用pandas.read_html()来抓取表,这是最佳实践,将涵盖大多数情况。

示例
import pandas as pd
pd.read_html(url)[0].iloc[:,1:-1]
输出

| | OEM|OEM编号|说明|ANS编号|
| - ------|- ------|- ------|- ------|- ------|
| 无|贝彻|小行星1007|垫片|美国国家标准-体重-0011|
| 1个|卡拉瑟斯|000878-十二|1/4”垫片|ANS-CRS-0001标准|
| 第二章|卡拉瑟斯|000878-12-不 rust 钢|1/4”不 rust 钢垫片|ANS-CRS-0001标准配置文件|
| 三个|卡拉瑟斯|000878-十四|3/8”垫片|ANS-CRS-0012标准|
| 四个|卡拉瑟斯|000878-十五|1/2”垫片|ANS-CRS-0016标准|
| 五个|卡拉瑟斯|000878-十六|3/4”垫片|美国国家标准-CRS-0003|
...
在备选方案中,使用css selectors选择更具体的元素:

doc.select('tr:has(td:-soup-contains("ANS-"))')
示例
from bs4 import BeautifulSoup
import requests

url = "https://www.advantagenationalsupply.com/oem-catalog/"
doc = BeautifulSoup(requests.get(url).text)

[dict(zip(doc.select_one('thead').stripped_strings, e.stripped_strings)) for e in doc.select('tr:has(td:-soup-contains("ANS-"))')]
输出
[{'OEM': 'Bettcher',
  'OEM Number': '100711',
  'Description': 'Spacer',
  'ANS-Number': 'ANS-BW-0011',
  'Quantity': 'Add to Quote'},
 {'OEM': 'Carruthers',
  'OEM Number': '000878-12',
  'Description': '1/4" Spacer',
  'ANS-Number': 'ANS-CRS-0001',
  'Quantity': 'Add to Quote'},
 {'OEM': 'Carruthers',
  'OEM Number': '000878-12-SS',
  'Description': '1/4" Spacer  SS',
  'ANS-Number': 'ANS-CRS-0001SS',
  'Quantity': 'Add to Quote'},...]

相关问题