Разбор Python BeautifulSoup - PullRequest
       3

Разбор Python BeautifulSoup

2 голосов
/ 22 декабря 2011

Я пытаюсь очистить некоторый контент (я очень новичок в Python), и я столкнулся с камнем преткновения. Код, который я пытаюсь очистить:

<h2><a href="/best-sellers/sj-b9822.html">Spear & Jackson Predator Universal Hardpoint Saw     - 22"</a></h2>
<p><span class="productlist_mostwanted_rrp">    
Was: <span class="strikethrough">£12.52</span></span><span class="productlist_mostwanted_save">Save: £6.57(52%)</span></p>

<div class="clear"></div>

<p class="productlist_mostwanted_price">Now: £5.95</p>

То, что я пытаюсь очистить, это текст ссылки (Копье, Джексон и т. Д.) И цена (5,95 фунтов стерлингов). Я посмотрел в Google, документации BeautifulSoup и на этом форуме, и мне удалось получить "Now: £ 5.95", используя этот код:

for node in soup.findAll('p', { "class" : "productlist_grid_price" }):
     print ''.join(node.findAll(text=True))

Однако результат, которого я добиваюсь - всего 5,95. Я также имел ограниченный успех, пытаясь получить текст ссылки (Копье и Джексон), используя:

soup.h2.a.contents[0]

Однако, конечно, это возвращает только первый результат.

Конечный результат, к которому я стремлюсь, состоит в том, чтобы результаты выглядели так:

Spear & Jackson Predator Universal Hardpoint Saw - 22 5.95
etc
etc

Поскольку я хочу экспортировать это в CSV, мне нужно выяснить, как поместить данные в 2 столбца. Как я уже сказал, я новичок в python, поэтому надеюсь, что это имеет смысл.

Я ценю любую помощь!

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

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Я думаю, что вы ищете что-то вроде этого:

from BeautifulSoup import BeautifulSoup
import re

soup = BeautifulSoup(open('prueba.html').read())
item = re.sub('\s+', ' ', soup.h2.a.text)
price = soup.find('p', {'class': 'productlist_mostwanted_price'}).text
price = re.search('\d+\.\d+', price).group(0)

print item, price

Пример вывода:

Spear & Jackson Predator Универсальная дисковая пила - 22 "5.95

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

0 голосов
/ 22 декабря 2011
html = '''
<h2><a href="/best-sellers/sj-b9822.html">Spear & Jackson Predator Universal Hardpoint Saw     - 22</a></h2>
<p><span class="productlist_mostwanted_rrp">    
Was: <span class="strikethrough">&pound;12.52</span></span><span class="productlist_mostwanted_save">Save: &pound;6.57(52%)</span></p>
<div class="clear"></div>
<p class="productlist_mostwanted_price">Now: &pound;5.95</p>
'''

from BeautifulSoup import BeautifulSoup
import re

soup = BeautifulSoup(html)
desc = soup.h2.a.getText()
price_str = soup.find('p', {"class": "productlist_mostwanted_price" }).getText()
price = float(re.search(r'[0-9.]+', price_str).group())

print desc, price
...