使用 bs4 获取标签属性的值

Grab the value of a tags attribute using bs4

我正在使用 bs4Python3 来获取在 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 标签的 data-attribute 属性的值。而 id 标签的 id 属性的值即将出来。 谁能告诉我哪里做错了。

这里有几点要说:

  1. 而不是使用html.text,使用as recommended here html.content.

  2. 为什么要在这里使用 lxmlhtml.parser应该没问题。

  3. 无需使用 data-attribute 标签:您可以使用 h2.text.

  4. 从 h2 中获取文本

收集产品标题的一种更简单的方法是直接遍历所有具有 s-inline class(产品标题)的 <h2>

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 class,所以 soup.find_all('h2', class_='s-inline") 只会从产品中获取 h2 标签。