Beautifulsoup,使用 link 抓取文本

Beautifulsoup, grab text with link

我正在制作一个网络蜘蛛来自动化我的一些工作。 我有一个 table 有很多驱动程序和不同操作系统的不同版本。 到目前为止一切正常,但我很难为每个操作系统分离 links。 我将 post 部分 html 放在这里,但我不能 post 整个页面。 问题是我不知道我能否抓取每个 link 及其旁边的文本,我可以抓取所有这些但我不知道 link 是什么操作系统.

这是table中一个单元格的内容,我只需要得到link和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>

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

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'))

假设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 将 return p 标签列表。

  • pTag.findNext('a') 对于每个 p 标签,findNext 将找到锚标签的下一次出现。此锚标记包含相关的 link

  • pTag.find('span', {'class' : 'MsoHyperlink' } ) find 将在当前 p 标签中找到 span,属性 class 设置为 MsoHyperlink

    • .spanreturn跨度中跨度return再见find

    • .text returns对应span的文字

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