【问题标题】:Beautifulsoup, grab text with linkBeautifulsoup,抓取带有链接的文本
【发布时间】:2015-07-25 05:17:48
【问题描述】:

我正在制作一个网络蜘蛛来自动化我的一些工作。 我有一张表,里面有很多驱动程序和针对不同操作系统的不同版本。 到目前为止一切正常,但我很难分离每个操作系统的链接。 我将在此处发布部分 html,但我无法发布整个页面。 问题是我不知道我是否可以抓取每个链接及其旁边的文本,我可以抓取所有链接,但我不知道哪些链接适用于什么操作系统。

这是表格中一个单元格的内容,我只需要获取链接以及操作系统版本(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'))

【问题讨论】:

  • 你想要LINK_TO_FILE旁边的文字吗?
  • 是的,在网页上它看起来像这样:链接到 file.zip Win8.1 链接到 file.zip Win10 所以我需要 WinXX 就在它旁边

标签: python python-3.x beautifulsoup


【解决方案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 将在当前的p 标记中找到span,属性class 设置为MsoHyperlink

    • .span返回由find返回的span内的span

    • .text返回对应span的文本

【讨论】:

  • 这看起来可行,我试过了,但有时 linkText 是一个“NoneType”类,然后我不能用它做任何事情,我假设链接时会发生这种情况旁边没有操作系统版本(某些驱动程序独立于操作系统)。有什么办法可以绕过它?我尝试比较“ type() == 'bs4.element.Tag'” 但这也无济于事
  • 我怀疑您需要有条件语句来确保整个输入字符串都保持 html 结构。或者您可以使用try 语句来处理您没有操作系统版本的情况。
【解决方案2】:
 os_cell = cells[4]
 os_span = os_cell.find("span", class_="MsoHyperlink")
 os = os_span.string

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2014-06-01
    • 2017-05-03
    • 2018-07-29
    • 2021-06-22
    相关资源
    最近更新 更多