Python Web Scrape索引

时间:2015-01-15 11:43:29

标签: html parsing python-2.7 beautifulsoup python-requests

我对任何形状或形式的网页抓取都很陌生,我一直在努力进入Python,我听说网络抓取是一种让自己暴露于Python的好方法。因此,经过多次谷歌搜索后,我终于开始使用两个强烈推荐的模块:Requests和BeautifulSoup。我已经阅读了相当多的数据,并对如何使用它们有基本的了解。

我发现了一个非常基本的网站(基本没有太多的内容或javascript等,使得解析HTML变得容易很多)我有以下代码:

import requests
from bs4 import BeautifulSoup

soup = BeautifulSoup(requests.get('http://www.basicwebs.co.uk/contact.htm').text)

for row in soup('div',{'id': 'Layer1'})[0].h2('font'):
    tds = row.text
    print tds

此代码有效。它产生以下结果:

BASIC
    WEBS
Contact details
Contact details

如果您花几分钟检查此页面上的代码,那么结果是否正确(我假设)。现在,问题是,虽然这段代码有效,但如果我想获得页面的不同部分呢?与页面上的小段落一样,“如果您对我们设计和托管的网站感兴趣,请通过电子邮件或电话与我们联系。” - 我的理解是简单地将索引号更改为找到此文本的相应标题,但是当我更改它时,我收到一条消息,列表索引超出范围。

有人可以帮忙吗? (如果可能,尽可能简单)

我正在使用Python 2.7.8

3 个答案:

答案 0 :(得分:1)

您需要的文本被字体标记包围,属性大小= 3,因此一种方法是选择第一次出现,如下所示:

font_elements = soup('font', {'size': 3})

if font_elements:
     print font_elements[0].text

<强>结果:

如果您对设计网站感兴趣     由我们主办,请通过电子邮件或电话与我们联系。

答案 1 :(得分:1)

您可以直接执行此操作:

soup('font',{'size': '3'})[0].text

但是,我想提请你注意你之前犯的错误。

soup('div',{'id': 'Layer1'})

这将返回div标签,其中id =&#39; Layer1&#39;这可能不止一个。所以它基本上返回了所有HTML元素的列表,这些元素的div标签有id =&#39; Layer1&#39;但不幸的是,你试图解析的HTML有一个这样的元素。所以它超出了界限。

您可以使用python的一些交互式解释器(如bpython或ipython)来测试您在对象中获得的内容。快乐黑客!!!

答案 2 :(得分:0)

from urllib.request import urlopen
from bs4 import BeautifulSoup

web_address=' http://www.basicwebs.co.uk/contact.htm'
html = urlopen(web_address)
bs = BeautifulSoup(html.read(), 'html.parser')

contact_info = bs.findAll('h2', {'align':'left'})[0]
for info in contact_info:
    print(info.get_text())