Очистка нескольких страниц для разбора в Beautiful Soup - PullRequest
0 голосов
/ 01 декабря 2011

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

import urllib2,sys
from BeautifulSoup import BeautifulSoup

for numb in ('85753', '87433'):
    address = ('http://www.presidency.ucsb.edu/ws/index.php?pid=' + numb)
html = urllib2.urlopen(address).read()
soup = BeautifulSoup(html)

title = soup.find("span", {"class":"paperstitle"})
date = soup.find("span", {"class":"docdate"})
span = soup.find("span", {"class":"displaytext"})  # span.string gives you the first bit
paras = [x for x in span.findAllNext("p")]

first = title.string
second = date.string
start = span.string
middle = "\n\n".join(["".join(x.findAll(text=True)) for x in paras[:-1]])
last = paras[-1].contents[0]

print "%s\n\n%s\n\n%s\n\n%s\n\n%s" % (first, second, start, middle, last)

Это дает мне результаты только для второго числа в последовательности numb, то есть http://www.presidency.ucsb.edu/ws/index.php?pid=87433. Я также предпринял несколько попыток использования механизации, но имелнет успехаВ идеале я хотел бы иметь страницу со списком ссылок, а затем автоматически выбирать ссылку, передавать HTML-код BeautifulSoup и затем переходить к следующей ссылке в списке.

Ответы [ 3 ]

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

Вот более простое решение (с использованием lxml):

import lxml.html as lh

root_url = 'http://www.presidency.ucsb.edu/ws/index.php?pid='
page_ids = ['85753', '87433']

def scrape_page(page_id):
    url = root_url + page_id
    tree = lh.parse(url)

    title = tree.xpath("//span[@class='paperstitle']")[0].text
    date = tree.xpath("//span[@class='docdate']")[0].text
    text = tree.xpath("//span[@class='displaytext']")[0].text_content()

    return title, date, text

if __name__ == '__main__':
    for page_id in page_ids:
        title, date, text = scrape_page(page_id)
1 голос
/ 01 декабря 2011

Я думаю, вы просто пропустили отступ в цикле:

import urllib2,sys
from BeautifulSoup import BeautifulSoup

for numb in ('85753', '87433'):
    address = ('http://www.presidency.ucsb.edu/ws/index.php?pid=' + numb)
    html = urllib2.urlopen(address).read()
    soup = BeautifulSoup(html)

    title = soup.find("span", {"class":"paperstitle"})
    date = soup.find("span", {"class":"docdate"})
    span = soup.find("span", {"class":"displaytext"})  # span.string gives you the first bit
    paras = [x for x in span.findAllNext("p")]

    first = title.string
    second = date.string
    start = span.string
    middle = "\n\n".join(["".join(x.findAll(text=True)) for x in paras[:-1]])
    last = paras[-1].contents[0]

    print "%s\n\n%s\n\n%s\n\n%s\n\n%s" % (first, second, start, middle, last)

Я думаю, что это должно решить проблему ..

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

Вам нужно поместить остальную часть кода в цикл. Прямо сейчас вы перебираете оба элемента в кортеже, но в конце итерации только последний элемент остается назначенным на address, который впоследствии анализируется вне цикла.

...