Python和BeautifulSoup新手在这里。
我正在试图搜索一个包含大约500个页面的论坛,每个页面包含50个单独的主题。其中一些线程包含大约200页的帖子。
我想编写一个程序,可以自动化方式抓取整个论坛的相关部分,并将一个URL作为入口点:
page_list = ['http://forum.doctissimo.fr/sante/diabete/liste_sujet-1.htm']
虽然我没有问题提取下一个链接'对于单个线程和包含线程的页面......:
def getNext_link(soup0bj):
#extracts a page's next link from the Bsoup object
try:
next_link = []
soup0bj = (soup0bj)
for link in soup0bj.find_all('link', {'rel' : 'next'}):
if link.attrs['href'] not in next_link:
next_link.append(link.attrs['href'])
return next_link
...我坚持使用一个程序,该程序接受该种子URL并仅从其承载的每个线程的第一页提取内容。然后程序结束:
for page in page_list:
if page != None:
html = getHTMLsoup(page)
print(getNext_link(html))
page_list.append(getNext_link(html))
print(page_list)
for thread in getThreadURLs(html):
if thread != None:
html = getHTMLsoup(thread)
print('\n'.join(getHandles(html)))
print('\n'.join(getTime_stamps(html)))
print('\n', getNext_link(html))
print('\n'.join(getPost_contents(html)),'\n')
我已尝试附加下一个链接'到page_list,但是没有工作,因为urlopen然后尝试访问列表而不是字符串。我也试过这个:
for page in itertools.chain(page_list):
...但该程序会抛出此错误:
AttributeError: 'list' object has no attribute 'timeout'
我真的被困住了。任何和所有的帮助都是最受欢迎的!
答案 0 :(得分:0)
我自己解决了这个问题,所以我发布了答案,以防万一其他人可能会受益。
所以,问题是urlopen无法打开列表中列表中的URL。
就我而言,每个论坛页面最多有1个相关的内部链接。而不是要求我的getNext_link函数返回包含内部链接的列表,如此处所示(请参阅空列表next_link)...
def getNext_link(soup0bj):
#extracts a page's next link (if available)
try:
soup0bj = (soup0bj)
next_link = []
if len(soup0bj.find_all('link', {'rel' : 'next'})) != 0:
for link in soup0bj.find_all('link', {'rel' : 'next'}):
next_link.append(link.attrs['href'])
return next_link
我要求它将URL作为字符串返回,如下所示:
def getNext_link(soup0bj):
try:
soup0bj = (soup0bj)
if len(soup0bj.find_all('link', {'rel' : 'next'})) != 0:
for link in soup0bj.find_all('link', {'rel' : 'next'}):
next_link = link.attrs['href']
return next_link
由于变量next_link只是一个字符串,因此可以很容易地将其添加到正在迭代的列表中(有关详细信息,请参阅上面的帖子)。瞧!