我有一个HTML如下:
<table class="stocksTable" summary="株価詳細">
<tr>
<th class="symbol"><h1>(株)みずほフィナンシャルグループ</h1></th>
<td class="stoksPrice realTimChange">
<div class="realTimChangeMod">
</div>
</td>
td class="stoksPrice">191.1</td>
<td class="change"><span class="yjSt">前日比</span><span class="icoUpGreen yjMSt">+2.5(+1.33%)</span></td>
</tr>
</table>
我尝试从包含191.1
的行中提取td class="stoksPrice">191.1</td>
。
soup = BeautifulSoup(html)
res = soup.find_all('stoksPrice')
print (res)
但结果是[]
。
如何找到它们?
答案 0 :(得分:2)
似乎有两个问题:
首先,您对find_all
的使用无效。您正在搜索名为stoksPrice
的标记名的当前方式是错误广告,您的标记为table
,tr
,td
,div
,{{1 }}。您需要将其更改为:
span
搜索该类的标签。
其次,您的HTML格式不正确。 >>> res = soup.find_all(class_='stoksPrice')
的列表是:
stoksPrice
应该是:
</td>
td class="stoksPrice">191.1</td>
(请注意</td>
<td class)="stoksPrice">191.1</td>
之前的<
)
不确定这是否是Stack Overflow中的复制错误,或者HTML最初是格式错误的,但这并不容易解析......
答案 1 :(得分:2)
由于有多个标签具有相同的类,因此您可以使用CSS选择器来获得完全匹配。
$imgage_path_uri = 'Path of image URI';
$derivative_uri = image_style_path('my_image_style', $imgage_path_uri);
$style = image_style_load('my_image_style');
// Generate derivative
$generated = image_style_create_derivative($style, $imgage_path_uri, $derivative_uri);
$s3_bucket = variable_get('s3fs_bucket', '');
$derivative_uri_u = str_replace('s3://', 'public://', $derivative_uri);
$derivative_uri = str_replace('s3://', '', $derivative_uri);
try{
$config = _s3fs_get_config();
$s3 = _s3fs_get_amazons3_client($config);
}catch(S3fsException $e){
form_set_error('form', $e->getMessage());
return FALSE;
}
$result = $s3->deleteObject(array(
'Bucket' => $s3_bucket,
'Key' => $derivative_uri
));
//create destination
$destination = file_stream_wrapper_uri_normalize($filepath .'/'. $filename);
//move your image file to from source to destination
$destination = file_unmanaged_move($source, $destination, FILE_EXISTS_REPLACE);
$dafd = image_style_create_derivative($style, $destination, $derivative_uri_u);
$result = $s3->putObject(array(
'Bucket' => $s3_bucket,
'Key' => $derivative_uri,
'SourceFile' => $derivative_uri_u,
'ACL' => 'public-read',
));
或者,您可以使用html = '''<table class="stocksTable" summary="株価詳細">
<tr>
<th class="symbol"><h1>(株)みずほフィナンシャルグループ</h1></th>
<td class="stoksPrice realTimChange">
<div class="realTimChangeMod">
</div>
</td>
<td class="stoksPrice">191.1</td>
<td class="change"><span class="yjSt">前日比</span><span class="icoUpGreen yjMSt">+2.5(+1.33%)</span></td>
</tr>
</table>'''
soup = BeautifulSoup(html, 'lxml')
print(soup.select_one('td[class="stoksPrice"]').text)
# 191.1
和lambda
来获得相同内容。
find
注意: BeautifulSoup会转换列表中的多值类属性。因此,两个print(soup.find(lambda t: t.name == 'td' and t['class'] == ['stoksPrice']).text)
# 191.1
代码的类看起来像td
和['stoksPrice']
。
答案 2 :(得分:0)
以下是使用findAll执行此操作的一种方法。
因为以前的所有stoksPrice
都是空的,所剩下的唯一一个是价格的那个..
您可以使用try / except子句检查它是否是浮点数。
如果不是,它将继续迭代,如果是,它将返回它。
res = soup.findAll("td", {"class": "stoksPrice"})
for r in res:
try:
t = float(r.text)
print(t)
except:
pass
191.1