2013-11-10 4 views
1

Я читал о разборе xml с python весь день, но, глядя на сайт, мне нужно извлечь данные, я не уверен, что я лаю вверх по неправильному дереву. В основном я хочу получить 13-значные штрих-коды с веб-сайта супермаркета (найденного во имя изображений). Например:Разбор xml в python - не понимаю DOM

http://www.tesco.com/groceries/SpecialOffers/SpecialOfferDetail/Default.aspx?promoId=A31033985

имеет 11 пунктов и 11 изображений, штрих-код для первого элемента является 0000003235676. Однако, когда я смотрю на исходный код страницы (я полагаю, что это лучший способ, чтобы извлечь все штрих-коды за один проход с python, urllib и beautifulsoup) все штрих-коды находятся на одной строке (строка 12), однако данные, похоже, не структурированы, как я ожидал бы с точки зрения элементов и атрибутов.

new TESCO.sites.UI.entities.Product({name:"Lb Mens Mattifying Dust 7G",xsiType:"QuantityOnlyProduct",productId:"275303365",baseProductId:"72617958",quantity:1,isPermanentlyUnavailable:true,imageURL:"http://img.tesco.com/Groceries/pi/805/5021320051805/IDShot_90x90.jpg",maxQuantity:99,maxGroupQuantity:0,bulkBuyLimitGroupId:"",increment:1,price:2.5,abbr:"g",unitPrice:3.58,catchWeight:"0",shelfName:"Mens Styling",superdepartment:"Health & Beauty",superdepartmentID:"TO_1448953606"}); 
new TESCO.sites.UI.entities.Product({name:"Lb Mens Thickening Shampoo 250Ml",xsiType:"QuantityOnlyProduct",productId:"275301223",baseProductId:"72617751",quantity:1,isPermanentlyUnavailable:true,imageURL:"http://img.tesco.com/Groceries/pi/225/5021320051225/IDShot_90x90.jpg",maxQuantity:99,maxGroupQuantity:0,bulkBuyLimitGroupId:"",increment:1,price:2.5,abbr:"ml",unitPrice:1,catchWeight:"0",shelfName:"Mens Shampoo ",superdepartment:"Health & Beauty",superdepartmentID:"TO_1448953606"}); 
new TESCO.sites.UI.entities.Product({name:"Lb Mens Sculpting Puty 75Ml",xsiType:"QuantityOnlyProduct",productId:"275301557",baseProductId:"72617906",quantity:1,isPermanentlyUnavailable:true,imageURL:"http://img.tesco.com/Groceries/pi/287/5021320051287/IDShot_90x90.jpg",maxQuantity:99,maxGroupQuantity:0,bulkBuyLimitGroupId:"",increment:1,price:2.5,abbr:"ml",unitPrice:3.34,catchWeight:"0",shelfName:"Pastes, Putty, Gums, Pomades",superdepartment:"Health & Beauty",superdepartmentID:"TO_1448953606"}); 

Возможно, что-то вроде BeautifulSoup является излишним? Я понимаю, что дерево DOM - это не то же самое, что и исходный источник, но почему они настолько разные - когда я перехожу к проверке элемента в firefox, данные кажутся структурированными, как я ожидал бы.

Извинения, если это встречается как совершенно глупо, спасибо заранее.

+0

на упомянутой странице есть элемент с идентификатором 'ч-278680465'. что это за штрих-код? – alko

+1

Здесь нет XML для синтаксического анализа; вы смотрите на источник JavaScript, встроенный в HTML-страницу. – hobbs

+0

Я думаю, вам нужно уточнить, будет ли ваша проблема получать биты javascript, которые вы показываете (что является проблемой синтаксического анализа dom/html), или если вам нужно выяснить, как анализировать данные, которые вы показываете. – Marcin

ответ

2

К сожалению, штрих-код не указан в HTML как структурированные данные; он появляется только как часть URL-адреса. Таким образом, мы должны изолировать URL, а затем обрывать штрих-кода с работы со строками:

import urllib2 
import bs4 as bs 
import re 
import urlparse 

url = 'http://www.tesco.com/groceries/SpecialOffers/SpecialOfferDetail/Default.aspx?promoId=A31033985' 

response = urllib2.urlopen(url) 
content = response.read() 
# with open('/tmp/test.html', 'w') as f: 
#  f.write(content) 
# Useful for debugging off-line: 
# with open('/tmp/test.html', 'r') as f: 
#  content = f.read() 
soup = bs.BeautifulSoup(content) 
barcodes = set() 
for tag in soup.find_all('img', {'src': re.compile(r'/pi/')}): 
    href = tag['src'] 
    scheme, netloc, path, query, fragment = urlparse.urlsplit(href) 
    barcodes.add(path.split('\\')[1]) 

print(barcodes) 

дает

set(['0000003222737', '0000010039670', '0000010036297', '0000010008393', '0000003050453', '0000010062951', '0000003239438', '0000010078402', '0000010016312', '0000003235676', '0000003203132']) 
+0

Я должен был указать, что штрих-коды имеют 13 цифр, поэтому в бит 0000003235676. Я надеялся, что это будет в том же месте, что и productId, и стрелял в ответ, как вы сказали, приветствует! – stackmeistergeneral

+1

Хорошо, я отредактировал сообщение; техника по сути одна и та же. – unutbu

+0

Это замечательно, спасибо большое! (хотя я чувствую, что я обманул LOL) – stackmeistergeneral

1

Поскольку ваш сайт использует javascript для форматирования его содержимого, вам может оказаться полезным переключиться с urllib на инструмент, например, Selenium. Таким образом, вы можете сканировать страницы по мере их рендеринга для реального пользователя с помощью веб-браузера. Это github project, кажется, решает вашу задачу.

Другой вариант будет отфильтровывать json-данные из скриптов javascript страницы и получать данные непосредственно оттуда.

+0

Спасибо, это выглядит многообещающе. – stackmeistergeneral

Смежные вопросы