beautifulGroup:将链接提取到文件并仅在后续重新运行时附加新链接

2024-05-17 06:23:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码从特定的网站提取链接。在

from bs4 import BeautifulSoup
import urllib2, sys
import re

def jobsinghana():
    site = "http://www.jobsinghana.com/jobs"
    hdr = {'User-Agent' : 'Mozilla/5.0'}
    req = urllib2.Request(site, headers=hdr)
    mayday = urllib2.urlopen(req)
    soup = BeautifulSoup(mayday)
    jobs = soup.find_all('a', {'class' : 'hover'})
    print str(jobs).strip('[]')


def modernghana():
    site = "http://www.modernghana.com/GhanaHome/classifieds/list_classifieds.asp?    menu_id=7&sub_menu_id=362&gender=&cat_id=173&has_price=2"
    hdr = {'User-Agent' : 'Mozilla/5.0'}
    req = urllib2.Request(site, headers=hdr)
    jobpass = urllib2.urlopen(req)
    soup = BeautifulSoup(jobpass)
    jobs = soup.find_all('a', href = re.compile('show_classifieds'))
    for a in jobs:
        header = a.parent.find_previous_sibling('h3').text
        a.string = header
        print a

jobsinghana = jobsinghana()
modernghana = modernghana()


alllinks = open('content.html', 'w')
alllinks.write("\n".join((jobsinghana, modernghana)))
allinks.close()
  1. 最后3行假设将提取的链接写入文件,但我得到以下错误:

    TypeError: sequence item 0: expected string, NoneType found
    
  2. 我还注意到,每当我运行程序时,代码都会再次提取所有链接,但由于大多数链接都是在代码运行的早期实例中提取的,所以我对在后续运行时只提取和附加新链接感兴趣。


Tags: 代码importidhdr链接jobssitefind
1条回答
网友
1楼 · 发布于 2024-05-17 06:23:24

你的函数都没有返回任何东西。默认情况下返回None,这会导致错误。在

return语句添加到函数中,而不是打印结果。您正在收集链接列表,因此需要更改代码以返回列表并将两个列表连接起来,或者将它们分别写入输出文件:

def jobsinghana():
    site = "http://www.jobsinghana.com/jobs"
    hdr = {'User-Agent' : 'Mozilla/5.0'}
    req = urllib2.Request(site, headers=hdr)
    mayday = urllib2.urlopen(req)
    soup = BeautifulSoup(mayday)
    return map(str, soup.find_all('a', {'class' : 'hover'}))


def modernghana():
    site = "http://www.modernghana.com/GhanaHome/classifieds/list_classifieds.asp?    menu_id=7&sub_menu_id=362&gender=&cat_id=173&has_price=2"
    hdr = {'User-Agent' : 'Mozilla/5.0'}
    req = urllib2.Request(site, headers=hdr)
    jobpass = urllib2.urlopen(req)
    soup = BeautifulSoup(jobpass)
    jobs = soup.find_all('a', href = re.compile('show_classifieds'))
    result = []
    for a in jobs:
        header = a.parent.find_previous_sibling('h3').text
        a.string = header
        result.append(str(a))
    return result

jobsinghana_links = jobsinghana()
modernghana_links = modernghana()


with open('content.html', 'w') as alllinks:
    alllinks.write("\n".join(jobsinghana_links + modernghana_links))

如果您需要跳过之前找到的链接,则必须读入链接,最好是将其放入一个集合中,以便在再次扫描时进行测试:

^{pr2}$

在读取链接的两个函数中,使用if link in existing:测试过滤掉existing中已经存在的任何链接。在

相关问题 更多 >