从源代码Python获取特定链接

时间:2015-07-20 21:41:28

标签: python web-scraping

我试图从包含大量数据的页面中删除链接。

我试图获得的链接具有此特定td(GIS 84F),页面中没有其他链接。这是源代码的一部分,它很长,所以我无法根据位置进行剪切。

<tr class="blueRow">
<td nowrap="nowrap">GIS 84F</td>
<td nowrap="nowrap"><a href="/Archives/fsl/data/1288776/000130817915000157/0001308179-15-000157-index.htm" id="documentsbutton">&nbsp;Documents</a></td>
<td class="small" >Other definitive proxy statements<br />Acc-no: 0001308179-15-000157&nbsp;(34 Act)&nbsp; Size: 2 MB            </td>
<td>2015-04-23</td>
<td nowrap="nowrap"><a href="/cgi-bin/browse-fsl?action=getcompany&amp;filenum=001-36380&amp;owner=exclude&amp;count=40">001-36380</a><br>15788924         </td>

我的尝试:

from bs4 import BeautifulSoup
import re
import urllib2

htmlpage = urllib2.urlopen('THELINK')
soup =  BeautifulSoup(htmlpage.read())
for link in soup.findAll('GIS 84F'):
    print link.get('href')

谢谢!

2 个答案:

答案 0 :(得分:1)

你可以这样做:

for link in soup.findAll('td', text='GIS 84F'):     # get the relevant tds
    parent = link.parent                            # get the parent tr
    for a in parent.findAll('a', href=True):        # get all the a tags within
        print a['href']                             # do whatever you want

答案 1 :(得分:0)

从你发布的html的外观来看,href实际上并不在你正在寻找的td元素中。

代码问题:

  • findAll不会搜索元素文字,因此它与td不匹配&#34; GIS 84F&#34;在里面。您可以使用更高级的匹配功能,或致电findAll("td")然后检查<td>的每个结果element.get_text().strip() == "GIS 84F",或致电findAll("tr")并查看孩子来更正此问题每个结果都有td个元素。

  • 如果link是包含文字匹配的元素,那么linktd元素,没有href。所以你真正想要做的就是&#34;一旦我找到包含相关文本的td,得到它的父元素,然后从那里得到第二个td,然后获取包含的href元素的a&#34;。在代码中,这类似于:

    link.getParent().findAll('td')[1].find('a').get('href')
    

老实说,我认为更好的方法是使用更强大的匹配语言,比如XPath,而不是做一大堆DOM操作,但这是你的通话。