我对任何形状或形式的网页抓取都很陌生,我一直在努力进入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
答案 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())