Получить части HTML-кода в виде новой строки в Python - PullRequest
1 голос
/ 03 января 2011

Мне было интересно, как я могу получить значение между некоторыми html-тегами из некоторого html-кода с использованием python.

Скажите, что я хотел узнать цену продукта на странице Amazon:

Я получил до:

url = raw_input("Enter the url:\n")
sock = urllib.urlopen(url)
htmlsource = sock.read()
sock.close()

так что теперь я получил источник HTML в виде строки, но я не знаю, как извлечь цену. Я играл с re.search, но не могу получить правильное выражение.

говорят, что цена находится между <span class="price">£79.98</span>

Какой самый лучший способ получить var1 = 79.98?

Ответы [ 3 ]

4 голосов
/ 03 января 2011

Вам нужно использовать HTML-библиотеку разбора. Он обеспечивает лучшие функции, чем использование стандартных регулярных выражений, где вы можете легко ошибиться и его трудно поддерживать. Стандартная библиотека Python поставляется с html.parse в py3k и HTMLParser в серии python2.x, которые помогут вам разобрать файл HTML и получить значения тегов.

Вы также можете использовать библиотеку BeautifulSoup , которую многие сочли простой в использовании.

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup('<span class="price">79.98</span>')
t = soup.find('span', attrs={"class":"price"})
print t.renderContents()
2 голосов
/ 03 января 2011

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

import lxml.html

url = raw_input("Enter the url:\n")
root = lxml.html.parse(url).getroot()
res = root.xpath('//span[@class="price"]/text()') or []

print res

возвращает что-то вроде

['\xc2\xa379.98', '\xc2\xa389.98', '\xc2\xa399.98']

Теперь мы имеем дело с простыми строками и должны использовать регулярное выражение,

import re

def getPrice(s):
    res =  re.search(r'\d+\.\d+', s)
    if res is None:
        return 0.
    else:
        return float(res.group(0))

prices = map(getPrice, res)
print prices

результат в

[79.98, 89.98, 99.98]
0 голосов
/ 03 января 2011

В качестве альтернативы BeautifulSoup вы можете попробовать lxml.Вот сравнение двух с lxml веб-сайта .

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