Я пытаюсь извлечь из веб-страницы, которая имеет много следующих div-ов (очевидно, все с разными данными, за исключением начальной части):

<div data-asin="B007R2E578" data-index="0" 
  class="sg-col-20-of-24 s-result-item sg-col-0-of-12 sg-col-28-of-32 sg-col-16-of-20 AdHolder sg-col sg-col-32-of-36 sg-col-12-of-16 sg-col-24-of-28">
  <div class="sg-col-inner">

Все эти div'ы начинаются одинаково с: <div data-asin=

Я пытаюсь извлечь их все с помощью функции find_all из Beautifulsoup:

structure = soup.find_all('div','data-asin=')

Однако он всегда возвращает пустой список.

Я не хочу использовать регулярные выражения.

Есть ли какая-нибудь функция в BeautifulSoup, которая может получить все эти div?

0
SkylerX 10 Июл 2019 в 09:22

3 ответа

Лучший ответ

Вы можете использовать селектор CSS div[data-asin] (выбрать все <div>, где присутствует атрибут data-asin):

data = '''<div data-asin="B007R2E578" data-index="0"
  class="sg-col-20-of-24 s-result-item sg-col-0-of-12 sg-col-28-of-32 sg-col-16-of-20 AdHolder sg-col sg-col-32-of-36 sg-col-12-of-16 sg-col-24-of-28">
  <div class="sg-col-inner">
   SOME DATA
  </div>
</div>'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'lxml')

for div in soup.select('div[data-asin]'):
    print(div['data-asin'], div.get_text(strip=True))

Печать :

B007R2E578 SOME DATA

Дальнейшее чтение:

Справочник по выбору CSS

РЕДАКТИРОВАТЬ: Чтобы получить некоторые данные из Amazon:

from bs4 import BeautifulSoup
import requests

url = 'https://www.amazon.com/s?k=iron&ref=nb_sb_noss_2'
headers = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0'}

soup = BeautifulSoup(requests.get(url, headers=headers).text, 'lxml')

for div in soup.select('div[data-asin]'):
    print(div['data-asin'])
    if div.select_one('.a-price'):
        print(div.select_one('.a-price ').get_text('|',strip=True).split('|')[0])
    if div.select_one('.a-text-normal'):
        print(div.select_one('.a-text-normal').text)

Печать :

B004ILTH1K
$62.81

Rowenta DW5080 1700-Watt Micro Steam Iron Stainless Steel Soleplate with Auto-Off, 400-Hole, Brown

B00OL5P1G8
$21.99

Sunbeam Steam Master 1400 Watt Mid-size Anti-Drip Non-Stick Soleplate Iron with Variable Steam control and 8' Retractable Cord, Black/Blue, GCSBCL-202-000

...etc.
3
Andrej Kesely 10 Июл 2019 в 07:01

Это дает вам все div, а затем фильтр

$ ( «: DIV ') каждый (функция ( ) { .

Var ele = $ (это);

});

0
vjay 10 Июл 2019 в 07:10

Найдите все теги div, а затем выполните понимание списка, которое поместит значение этого атрибута в список, если у него есть этот атрибут:

html = '''<div data-asin="B007R2E578" data-index="0" 
  class="sg-col-20-of-24 s-result-item sg-col-0-of-12 sg-col-28-of-32 sg-col-16-of-20 AdHolder sg-col sg-col-32-of-36 sg-col-12-of-16 sg-col-24-of-28">
  <div class="sg-col-inner">'''



from bs4 import BeautifulSoup


soup = BeautifulSoup(html, 'html.parser')
divs = soup.find_all('div')

a_list = [ div['data-asin'] for div in divs if div.has_attr('data-asin')]
1
chitown88 10 Июл 2019 в 06:31