使用BeautifulSoup和Python

时间:2016-04-28 10:55:34

标签: python python-2.7 csv web-scraping beautifulsoup

BeautifulSoup上有很多东西,但我找不到任何可以解决这个问题的东西...我想通过在代码中指定前后文本的位来提取两位html之间的文本。我可以使用Outwit Python模块执行此操作,但这次需要使用BeautifulSoup ...

我想要的页面位是下面的用户名:

<a class="generic_class" href="/people/username">

所以,我想通过告诉它寻找

来指定beautifulsoup来刮取用户名
  

'a class =“generic_class”href =“/ people /'

之前刮掉并停止之后

  

“'

然后我希望它在csv的一个url循环中执行此操作(这已经有效),然后逐行将结果追加到新的csv(这个位可能不起作用):

for row in url_reader:
    url = row[0]
    page = br.open(url).read()
    soup = BeautifulSoup(br.response().read())
    user = soup.findAll('<a class="generic_class" href="/people/') # this is the line where the code that works should go! Obviously this bit does nothing as it doesn't extract what comes after, stopping at the closing quotation mark for the end of the href.
    page.append.user(output_file) # not sure if this is right?!

显然,在一个理想的世界里,我把它放在if / else中if(发现“找不到页面”)和其他(做上面的事情)来处理那些不起作用的网址,但是我我会在错误处理中完成一次我能真正做到的事情!这是我的首要任务......

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:0)

你不能只提取“href”属性值并解析那个吗?

usernames = []

for anchor in soup.findAll('a', {'class': 'generic_class'}):
    usernames.append(anchor['href'].split('/')[-1])

with open('usernames.csv', 'ab') as f:
    writer = csv.writer(f)
    for username in usernames:
        writer.writerow([username])

这只是一个简单的例子,我建议进行一些额外的验证等。

答案 1 :(得分:0)

您可以在href属性中传递函数:

def start_with_people(href):
    return href and href.startswith('/people/')

a_tags = soup.find_all('a', class_='generic_class', href=start_with_people)

这将返回所有<a>代码,这些代码的href以/people/开头。

获得这些锚标记后:

  1. 你可以循环它

  2. 获取href

  3. 拆分并获取用户名