我正在尝试从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…)'的变体
答案 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
使我们能够选择包含tr
和td
的主要标签,然后选择必要的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库来重试,以使您的代码看起来更好,例如: