Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Beautiful Soup中抓取多个页面进行解析_Python_Web Scraping_Urllib2 - Fatal编程技术网

Python 在Beautiful Soup中抓取多个页面进行解析

Python 在Beautiful Soup中抓取多个页面进行解析,python,web-scraping,urllib2,Python,Web Scraping,Urllib2,我正试图从一个网站上刮下多个页面,以便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

我正试图从一个网站上刮下多个页面,以便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
序列中第二个数字的结果,即。我也尝试过使用mechanize,但没有成功。理想情况下,我希望能够创建一个包含链接列表的页面,然后自动选择一个链接,将HTML传递给BeautifulSoup,然后移动到列表中的下一个链接。

您需要将其余代码放入循环中。现在,您正在对元组中的两个项进行迭代,但在迭代结束时,只有最后一个项仍然被分配给
地址
,该地址随后被解析到循环外部。

您需要将其余的代码放在循环内部。现在,您正在对元组中的两个项进行迭代,但在迭代结束时,只有最后一个项仍然被分配给
地址
,该地址随后会在循环外部进行解析。

这里有一个更整洁的解决方案(使用lxml):

这里有一个更整洁的解决方案(使用lxml):


我想你错过了循环中的缩进:

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)

我认为这应该可以解决问题。

我认为您刚刚错过了循环中的缩进:

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)

我认为这应该解决问题。

这就是问题所在。非常感谢,这就是问题所在。非常感谢,这就是问题所在。上面的答案指出了这一点。非常感谢你的帮助,这就是问题所在。上面的答案指出了这一点。非常感谢你的帮助,谢谢。实际上,我更喜欢这个方法,而不是BeautifulSoup方法。我喜欢这个解决方案。你将如何保存你正在抓取的页面?@Joe应该像这里的第三个例子一样简单:谢谢。实际上,我更喜欢这个方法,而不是BeautifulSoup方法。我喜欢这个解决方案。您将如何保存正在刮取的页面?@Joe应该像这里的第三个示例一样简单: