从div内部的href中提取/擦除文本

时间:2014-02-05 15:19:08

标签: python html web-scraping beautifulsoup screen-scraping

我正在使用漂亮的汤(bs4)和Python我目前有这种结构

<div class="class1">
  <a class="name" href="/doctor/dr-xxxxxxxxx"><h2>Dr. XX XXXX</h2></a>
  <p class="specialties"><a href="/location/abcd">ab cd</a></p>
  <p class="doc-clinic-name">
     <a class="light_grey link" href="/clinic/fff">f ff</a>
  </p>
</div>


<div class="class2">
  <p class="locality">
    <a class="link grey" href="/location/doctors/ccc">c cc</a>
  </p>
  <p class="fees">INR 999</p>
  <div class="timings">
       <p><span class="strong">MON-SAT</span><br/><span>11:00AM-1:00PM</span>                                   <span>6:00PM-8:00PM</span></p>
  <div class="clear"></div>
</div>

到目前为止,我的代码是

import urllib2
from bs4 import BeautifulSoup

soup = BeautifulSoup(urllib2.urlopen('abc.com').read())

 for post in soup.find("div", "class1"):
print post

for x in soup.find("div", "class2"):
    print x 

所以基本上post和x包含divs class1和class2。现在我要提取的信息是

DR.XXXXXX A B C D FFF CCC 999印度卢比 MON-SAT上午11:00至下午1:00

如何在post和x变量内部分支以获取所需信息。感谢

修改

我在html中添加了空格。是否有可能在不损害空间的情况下生成格式的csv? DR。 XX XXXX,ab cd,f ff,c cc,INR 999,MON-SAT 11:00 AM-1:00 PM

2 个答案:

答案 0 :(得分:1)

首先,你的缩进看起来不对劲。其次,我认为在使用for时你不需要find循环,因为它应该只返回第一个匹配。

如果您只想要链接,可以尝试:

for link in soup.find("div", {"class": "class1"}).findAll("a"):
  print link.text

或者,如果您想要链接本身:

for link in soup.find("div", {"class": "class1"}).findAll("a"):
  print link.get("href")

您还应该注意用于搜索类的方法,方法是将dict传递给find方法(编辑:我怀疑还有其他方法可以做到这一点。这就是我学会做的方式它!)

因此,您可以根据需要具体提供。

doctorlink = soup.find(("div", {"class": "class1"}).find("a", {"class": "name"})

答案 1 :(得分:1)

>>> ' '.join(soup.find("div", "class1").getText().split())
u'Dr. XXXXXX abcd fff'
>>> ' '.join(soup.find("div", "class2").getText().split())
u'ccc INR 999 MON-SAT11:00AM-1:00PM 6:00PM-8:00PM'