Beautifulsoup,抓住链接的文本

时间:2015-05-13 18:47:22

标签: python python-3.x beautifulsoup

我正在制作一个网络蜘蛛来自动完成我的一些工作。 我有一个包含许多驱动程序和不同版本的表用于不同的操作系统。 到目前为止一切正常,但我很难分离每个操作系统的链接。 我会在这里发布部分HTML,但我无法发布整个页面。 问题是我不知道我能抓住每个链接和它旁边的文本,我可以抓住所有这些但我不知道什么链接,如果是什么操作系统。

这是表格中一个单元格的内容,我只需要获得与OS版本相关的链接(win8.1,win10,win7)

<p class="MsoNormal" style="mso-line-height-alt:9.3pt"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1F497D">SfP/StP
    <a href="LINK_TO_FILE">AHWFW0609P_WinB</a>.zip
    </span><span class="MsoHyperlink"><b><sup><span style="font-size:11.0pt;
    font-family:&quot;Calibri&quot;,sans-serif;color:#984806;background:white;text-decoration:
    none;text-underline:none">Win8.1</span></sup></b></span><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif"><o:p></o:p></span></p>

<p class="MsoNormal" style="mso-line-height-alt:9.3pt"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#1F497D">SfP/StP
    <a href="LINK_TO_FILE">AHWFW0553P_WinT</a></span><span style="color:#1F497D">.</span><span style="font-size:11.0pt;font-family:
    &quot;Calibri&quot;,sans-serif;color:#1F497D">zip</span><span class="MsoHyperlink"><b><sup><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif;color:#984806;
    background:white;text-decoration:none;text-underline:none"> Win10</span></sup></b></span><span class="MsoHyperlink"><b><sup><span style="color:#984806;background:white;
    text-decoration:none;text-underline:none"><o:p></o:p></span></sup></b></span></p>

这是我用来获取名称和链接的代码。

file = open(r"Path to HTML file", 'rb')
drivers = {}
rng_lst = [str(x) for x in range(5, 43)]

soup = bs4.BeautifulSoup(file)

table = soup.findAll('table')[0]
for row in table.findAll('tr'):
    cells = row.findAll('td')
    if len(cells) > 4:
        cell_num = cells[1].get_text(strip=True)
        if any(cell_num == n for n in rng_lst):
            drv_name = cells[2].get_text(strip=True)
            drivers[drv_name] = {'links': []}
            links = cells[4].findAll('a')
            for link in links:
                drivers[drv_name]['links'].append(link.get('href'))

2 个答案:

答案 0 :(得分:1)

假设string包含html内容

from bs4 import BeautifulSoup

soup = BeautifulSoup(string)

for pTag in soup.find_all('p'):
        anchorTag =  pTag.findNext('a')
        linkText =  pTag.find('span', {'class' : 'MsoHyperlink' } ).span.text
        print "LpTag.findNext('a')ink : ", anchorTag["href"]
        print "Text to Link ", linkText
        print

会给你一个输出

Link :  LINK_TO_FILE
Text to Link  Win8.1

Link :  LINK_TO_FILE
Text to Link   Win10

它的作用是什么?

通过查看输入字符串,我们可以知道我们感兴趣的锚点和文本存在于p标记内。

该文本位于span标记内,该标记位于另一个span标记下,该标记位于锚标记旁边。

  • soup.find_all('p') find_all将返回p代码列表。

  • pTag.findNext('a')对于每个p标记,findNext都会找到锚标记的下一个出现位置。此锚标记包含相关链接

  • pTag.find('span', {'class' : 'MsoHyperlink' } ) find会在当前span代码中找到p,其中class属性设置为MsoHyperlink < / p>

    • .span返回由find

    • 返回的范围内的范围
    • .text返回相应范围

    • 的文字

答案 1 :(得分:0)

 os_cell = cells[4]
 os_span = os_cell.find("span", class_="MsoHyperlink")
 os = os_span.string