Замените BeautifulSoup другим (стандартным) модулем парсинга HTML в этом скрипте Python - PullRequest
0 голосов
/ 02 сентября 2011

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

Вот код, он получает каждую ссылку на пользовательскую карту от данного пользователя карт Google. ####### отмечены строки, использующие BeautifulSoup:

# coding: utf-8

import urllib, re
from BeautifulSoup import BeautifulSoup as bs

uid = '200931058040775970557'
start = 0
shown = 1

while True:
    url = 'http://maps.google.com/maps/user?uid='+uid+'&ptab=2&start='+str(start)
    source = urllib.urlopen(url).read()
    soup = bs(source)  ####
    maptables = soup.findAll(id=re.compile('^map[0-9]+$'))  #################
    for table in maptables:
        for line in table.findAll('a', 'maptitle'):  ################
            mapid = re.search(uid+'\.([^"]*)', str(line)).group(1)
            mapname = re.search('>(.*)</a>', str(line)).group(1).strip()[:-3]
            print shown, mapid, '\t', mapname
            shown += 1

            urllib.urlretrieve('http://maps.google.com.br/maps/ms?msid=' + uid + '.' + str(mapid) +
                               '&msa=0&output=kml', mapname + '.kml')


    if '<span>Next</span>' in str(source):
        start += 5
    else:
        break

Как вы можете видеть, есть только три строки кода, использующие BSoup, но я не программист, и у меня возникли большие трудности при попытке использовать другие стандартные инструменты синтаксического анализа HTML и XML, вероятно, потому что я пробовал неправильный путь, Я думаю.

РЕДАКТИРОВАТЬ: Этот вопрос больше относится к замене трех строк кода этого скрипта, чем к поиску способа решения типичных проблем с синтаксическим анализом HTML.

Любая помощь будет высоко ценится, спасибо за чтение!

Ответы [ 3 ]

4 голосов
/ 02 сентября 2011

К сожалению, Python не имеет полезного разбора HTML в стандартной библиотеке, поэтому единственный разумный способ разбора HTML - это использование стороннего модуля, такого как lxml.html или BeautifulSoup. Это не означает, что у вас должна быть отдельная зависимость - эти модули являются свободным программным обеспечением, и если вам не нужна внешняя зависимость, вы можете объединить их со своим кодом, который затем не сделает их больше зависимость, чем код, который вы пишете сами.

0 голосов
/ 04 сентября 2011

Я попробовал этот код (см. Ниже), и он показывает список ссылок. Поскольку я не установил красивый суп и не хочу этого, мне очень сложно сравнить результаты с тем, что дает ваш код. «Чистый» код Python без «супа» еще короче и удобочитаем. Во всяком случае, вот оно. Скажи мне, что ты думаешь ! Дружелюбно, Луи.

#coding: utf-8

import urllib, re

uid = '200931058040775970557'
start = 0
shown = 1

while True:
    url = 'http://maps.google.com/maps/user?uid='+uid+'&ptab=2&start='+str(start)
    source = urllib.urlopen(url).read()
    while True:
        endit = source.find('maptitle')
        mapid = re.search(uid+'\.([^"]*)', str(source)).group(1)
        mapname = re.search('>(.*)</a>', str(source)).group(1).strip()[:-3]
        print shown, mapid, '\t', mapname
        shown += 1
        urllib.urlretrieve('http://maps.google.com.br/maps/ms?msid=' + uid + '.' + str(mapid) + '&msa=0&output=kml', mapname + '.kml')

    if '<span>Next</span>' in str(source):
        start += 5
    else:
        break
0 голосов
/ 02 сентября 2011

для разбора HTML-кода, который я вижу, есть три решения:

  • использовать простой поиск по строке (.find (), ...) Fast!
  • использовать регулярные выражения (aka regex))
  • использовать HTMLParser
...