我正在使用 bs4 与 Python3 来获取在 amazon 上搜索到的产品的详细信息, 这是我的代码:
from bs4 import BeautifulSoup as BS
import requests
html = requests.get('http://www.amazon.in/s/ref=nb_sb_noss_2?url=search-
alias%3Daps&field-keywords=hp+monitors')
soup = BS(html.text , 'lxml')
#print(soup.prettify())
for i in soup.find_all('li') :
print(i.get('id'))
h2_tag = i.h2
print(h2_tag.get('data-attribute'))
print("_____")
使用此代码,我无法获得 h2 标记的数据属性属性的值。而 li 标记的 id 属性的值正在出现。 任何人都可以告诉我在哪里做错了。
答案 0 :(得分:1)
这里有几点要说:
而不是html.text
,请使用as recommended here html.content
。
为什么要在这里使用lxml
? html.parser
应该没问题。
无需使用data-attribute
代码:您只需使用h2.text
抓取h2中的文字。
收集产品标题的简单方法是直接遍历具有<h2>
类(产品标题)的所有s-inline
:
from bs4 import BeautifulSoup
import requests
html = requests.get('http://www.amazon.in/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords=hp+monitors')
soup = BeautifulSoup(html.content , 'html.parser')
for h2 in soup.find_all('h2', class_='s-inline'):
print(h2.text)
输出
HP 24ES 23.8-HP 24ES 23.8-inch THINNEST LED Monitor (Black)LED Monitor (Black)
HP 22es Display 54.6 cm, 21.5 Inch THINNEST IPS LED Backlit Monitor
HP 22KD 21.5-inch FULL HD LED Backlit Monitor (Black
HP 19KA 18.5-inch LED Backlit Monitor (Black)
HP 27es 27 Inches Display IPS LED Backlit Monitor (Full HD)
HP 21KD 20.7-inch FULL HD LED Backlit Monitor (Black)
LG 24MP88HV-S 24"IPS Slim LCD Monitor
Dell S Series S2415H 24-Inch Screen Full HD HDMI LED Monitor
Dell E1916HV 18.5-inch LED Monitor (Black)
HP 20KD 19.5-inch LED Backlit Monitor (Black)
Dell S2216H 21.5-Inch Full HD LED Monitor
HP V222 21.5" LED Widescreen Monitor (M1T37AA Black)
AlexVyan®-Genuine Accessory with 1 year warranty:= (38.1CM) 15 Inch LCD Monitor for HP, Dell, Lenovo, Pc Desktop Computer Only (Black)
Compaq B191 18.5-inch LED Backlit Monitor (Black)
HP 20WD 19.45-Inch LED Backlit Monitor
HP Compaq F191 G9F92AT 18.5-inch Monitor
此外,不要使用粗体显示内联代码,而是使用这样的反引号:
`codecode`将呈现为codecode
修改强>
在这里,soup.find_all('h2')
会从页面中获取所有h2标签,但亚马逊页面也有除产品之外的其他元素的h2标签。我刚刚注意到所有产品都有s-inline
类,因此soup.find_all('h2', class_='s-inline")
只会从产品中获取h2代码。