Использование SoupStrainer для выборочного анализа

Я пытаюсь разобрать список названий видеоигр с торгового сайта. однако, поскольку список элементов хранится внутри тега.

Это раздел документации предположительно объясняет, как анализировать только часть документа, но я не могу это понять. мой код:

from BeautifulSoup import BeautifulSoup
import urllib
import re

url = "Some Shopping Site"
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)
for a in soup.findAll('a',{'title':re.compile('.+') }):
    print a.string

в настоящее время печатает строку внутри любого тега, который имеет непустую ссылку на заголовок. но он также печатает предметы на боковой панели, которые являются специальными предложениями. если я смогу взять только раздел списка продуктов, я убью двух зайцев одним выстрелом.

Большое спасибо.


person Scraper    schedule 23.10.2010    source источник


Ответы (2)


О боже, я глупый, я искал теги с атрибутом id = products, но это должен был быть product_list

вот окончательный код, если кто-то придет искать.

from BeautifulSoup import BeautifulSoup, SoupStrainer
import urllib
import re


start = time.clock()
url = "http://someplace.com"
html = urllib.urlopen(url).read()
product = SoupStrainer('div',{'id': 'products_list'})
soup = BeautifulSoup(html,parseOnlyThese=product)
for a in soup.findAll('a',{'title':re.compile('.+') }):
      print a.string
person Scraper    schedule 24.10.2010
comment
В bs4 теперь parse_only= - person Timo; 31.01.2021

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

product = soup.find('div',{'id': 'products'})
for a in product.findAll('a',{'title': re.compile('.+') }):
   print a.string
person dusan    schedule 23.10.2010
comment
попробовал это, но выдал эту ошибку: Traceback (последний последний вызов): файл ~/start.py, строка 11, в ‹module› для a в product.findAll('a',{'title':re.compile( '.+') }): AttributeError: объект 'ResultSet' не имеет атрибута 'findAll' - person Scraper; 24.10.2010
comment
Попробуйте позвонить soup.find вместо soup.findAll. - person dusan; 24.10.2010
comment
не дает мне это, Traceback (последний последний вызов): файл ~/src/start.py, строка 13, в ‹module› для a в product.findAll('a',{'title':re.compile( '.+') }): AttributeError: объект 'NoneType' не имеет атрибута 'findAll' - person Scraper; 24.10.2010
comment
Хорошо, я попытался реализовать фильтр, и вот что у меня получилось, но он печатает что угодно (извините, не знаю, как делать новые строки в комментарии) url = somelink html = urllib.urlopen(url).read() product = SoupStrainer ('div',{'id': 'products'}) суп = BeautifulSoup(html,parseOnlyThese=product) для a в супе.findAll('a',{'title':re.compile('.+') }): напечатать строку - person Scraper; 24.10.2010