如何抓取HTML的下一行

时间:2019-07-19 12:38:27

标签: python html

我正在尝试从HTML中的表中抓取代码。就像在表中一样,它们都共享相同的标签,所以我很难找到隔离该字符串的另一种方法。我使用的方式很气质。

表元素:

<table class="factsheet-table table-no-border spacer-bottom">
…
<tbody>
…(to the required line)
<tr class="table-alt">

                <th class="align-left">
                    ISIN:
                </th>

                <td class="align-left">
                                            XS0105244585
                                    </td>

            </tr>

        quote_page = 'https://www.hl.co.uk/shares/shares-search-results/t/tesco-6-2029'
        page = urlopen(quote_page)
        soup = BeautifulSoup(page, 'html.parser')

        # Get Bond code
        search = re.compile('ISIN:')
        bond_code = soup.find(text=search).parent.find_next('td').contents[0]
        code = bond_code.strip()

我只想获取代码,但我想隔离它的唯一方法是获取“ ISIN:”之后的下一行代码。

我通常会得到'AttributeError:'NoneType'对象没有属性(parent / find_next…)'的变体

2 个答案:

答案 0 :(得分:0)

我通过使用函数get_bond进行查询:

def get_bond(tag):
    return re.match('ISIN:', tag.text.strip())

quote_page = 'https://www.hl.co.uk/shares/shares-search-results/t/tesco-6-2029'
page = urlopen(quote_page)

soup = BeautifulSoup(page.text, 'html.parser')

# Get Bond code
bond_code = soup.find(get_bond)

# Get ISIN code
isin_code = bond_code.find('td').text.strip()
print(isin_code)

get_bond使我们能够选择包含trtd的主要标签,然后选择必要的td

答案 1 :(得分:0)

您的代码看起来不错,它也对我有用。 由于没有其他可以锚定搜索的内容,因此我认为使用文本选择器是可以接受的。

但是,您正在抓取的网站有时不会对页面进行响应,而是会显示如下错误消息:

<html><head>
<H1>Request Rejected</H1>
</head>
<body><P>The requested URL was rejected.</P>
<P>Please contact the Hargreaves Lansdown internet support team on 0116 800 8000 quoting reference: 1112223334445556667</P>
</body>
</html>

在这种情况下,它找不到您的文本正则表达式,并且会失败。

您可以通过重试整个代码块来解决此问题:

from bs4 import BeautifulSoup
from urllib2 import urlopen
import re
from time import sleep


# retry 10 times
for attempt in range(10):
    quote_page = 'https://www.hl.co.uk/shares/shares-search-results/t/tesco-6-2029'
    page = urlopen(quote_page).read()
    try:
        soup = BeautifulSoup(page, 'html.parser')
        search = re.compile('ISIN:')
        bond_code = soup.find(text=search)
        bond_code = bond_code.parent.find_next('td').contents[0]
        code = bond_code.strip()
        print("Found code:")
        print(code)
    except Exception as e:
        # log the error or simply pass
        print(e)
        print("Page was:")
        print(page)
        sleep(2) # wait 2 seconds before retrying
    else:
        break
else:
    # we failed all the attempts - deal with the consequences.
    print("Failed 10 times to get ISIN")

您还可以使用python库来重试,以使您的代码看起来更好,例如: